Script 8 for Kitchel et al.Ā 2024 in prep taxonomic diversity manuscript.

library(data.table)
library(MuMIn)
library(ggplot2)
library(cowplot)
library(lme4)
library(stringr)
library(nlme)

#pull in function to calculate model estimates and standard errors
source(here::here("analysis_code","extract_coefficients_function.R"))

###Predicts annual dissimilarity with annual characteristics, temperature and fishing values

Pull in - region areas (if not already loaded) - region characteristics (if not already loaded); saveRDS(FishGlob_richness_year_survey, file = here::here(ā€œoutputā€,ā€œFishGlob_richness_year_survey.Rdsā€)) - fishing (if not already loaded) - temp (if not already loaded)

Add survey area to dissimilarities data table

#physical area by year
region_area_byyear <- fread(here::here("output","region_area_byyear.csv"))

#merged fishing, temp, dissimilarities
dissimilarities_temp_fishing <- fread(here::here("output","dissimilarities_temp_fishing.csv"))

#combine
dissimilarities_temp_fishing_area <- dissimilarities_temp_fishing[region_area_byyear, on = c("survey_unit","year")]

#only occurrence-based jaccard for these analyses
dissimilarities_temp_fishing_area.jaccard <- dissimilarities_temp_fishing_area[dissimilarity_metric == "jaccard_dissimilarity_index_binary",]

Add in season/Julian day to dissimilarities data table

#load up julian days
dates_regions <- readRDS(here::here("output","dates_regions.rds"))

#most common season per year
# Function to get the most frequent value
get_mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

# Apply the function to each group
dates_regions.r <- dates_regions[, .(season = get_mode(season)), by = c("survey_unit","year")]


#merge
dissimilarities_temp_fishing_area.jaccard <- dates_regions.r[dissimilarities_temp_fishing_area.jaccard, on = c("survey_unit","year")]

Pull in palette and name helper

source(here::here("analysis_code","color_links.R"))

Pull in observed dissimilarity trend values

jaccard_total_coefs.r <- fread(here::here("output","jaccard_total_coefs.r.csv"))

Plot fishing and temperature vs.Ā time for all regions

#######TEMPERATURE

#set order by survey unit for plotting
all_surveys <- levels(as.factor(dissimilarities_temp_fishing_area.jaccard$survey_unit))
setorder(dissimilarities_temp_fishing_area.jaccard, survey_unit)

dissimilarities_temp_fishing_area.jaccard[,Survey_Name_Season:=factor(Survey_Name_Season, levels = unique(dissimilarities_temp_fishing_area.jaccard$Survey_Name_Season), ordered = T)]

(sbt_time_survey_facet_1_20 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[1:20] & year > 1979]) +
  labs(y = "Mean bottom temperature (˚C)",  x = "Year") +
  geom_point(aes(y = as.numeric(yearly_mean_bypoint_avg), x = year), alpha = 0.3) +
  geom_smooth(aes(y = as.numeric(yearly_mean_bypoint_avg), x = year), method = "lm") +
  scale_x_continuous(breaks = ~ axisTicks(., log = FALSE)) +
  theme_classic() +
  theme(axis.text.x = element_text(size = 7)) +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4))

ggsave(sbt_time_survey_facet_1_20, path = here::here("figures"), filename = "sbt_time_survey_facet_1_20.jpg", height = 12, width =9)


(sbt_time_survey_facet_21_34 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[21:34] & year > 1979]) +
  labs(y = "Mean bottom temperature (˚C)",  x = "Year") +
  geom_point(aes(y = as.numeric(yearly_mean_bypoint_avg), x = year), alpha = 0.3) +
  geom_smooth(aes(y = as.numeric(yearly_mean_bypoint_avg), x = year), method = "lm") +
  scale_x_continuous(breaks = ~ axisTicks(., log = FALSE)) +
  theme_classic() +
  theme(axis.text.x = element_text(size = 7)) +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4))

ggsave(sbt_time_survey_facet_21_34, path = here::here("figures"), filename = "sbt_time_survey_facet_21_34.jpg", height = 12, width =9)


#######FISHING

dissimilarities_temp_fishing_area.jaccard.cc <- dissimilarities_temp_fishing_area.jaccard[complete.cases(dissimilarities_temp_fishing_area.jaccard[,summed_tonnes_scaled_byreg]),]

(fishing_time_survey_facet_1_20 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard.cc[survey_unit %in% all_surveys[1:20] & year > 1979]) +
  labs(y = "Relative fishing catch",  x = "Year") +
  geom_point(aes(y = summed_tonnes_scaled_byreg, x = year), alpha = 0.3) +
  geom_smooth(aes(y = summed_tonnes_scaled_byreg, x = year), method = "lm") +
  scale_x_continuous(breaks = ~ axisTicks(., log = FALSE)) +
  theme_classic() +
  theme(axis.text.x = element_text(size = 7)) +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4))

ggsave(fishing_time_survey_facet_1_20, path = here::here("figures"), filename = "fishing_time_survey_facet_1_20.jpg", height = 12, width =9)


(fishing_time_survey_facet_21_34 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard.cc[survey_unit %in% all_surveys[c(21:34)] & year > 1979]) +
  labs(y = "Relative fishing catch",  x = "Year") +
  geom_point(aes(y = summed_tonnes_scaled_byreg, x = year), alpha = 0.3) +
  geom_smooth(aes(y = summed_tonnes_scaled_byreg, x = year), method = "lm") +
  scale_x_continuous(breaks = ~ axisTicks(., log = FALSE)) +
  theme_classic() +
  theme(axis.text.x = element_text(size = 7)) +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4))

ggsave(fishing_time_survey_facet_21_34, path = here::here("figures"), filename = "fishing_time_survey_facet_21_34.jpg", height = 12, width =9)

NA
NA

Plot fishing and temperature vs.Ā dissimilarity for all regions

#####MEAN TEMP
(preds_sbt_mean_temp_survey_facet_1_20 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[1:20] & year > 1979]) +
  labs(x = "Mean bottom temperature (˚C)",  y = "β-diversity") +
  geom_point(aes(x = as.numeric(yearly_mean_bypoint_avg), y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = as.numeric(yearly_mean_bypoint_avg), y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_mean_temp_survey_facet_1_20, path = here::here("figures"), filename = "preds_sbt_mean_temp_survey_facet_1_20.jpg", height = 12, width =9)


(preds_sbt_mean_temp_survey_facet_21_34 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[21:34] & year > 1979]) +
  labs(x = "Mean bottom temperature (˚C)",  y = "β-diversity") +
  geom_point(aes(x = as.numeric(yearly_mean_bypoint_avg), y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = as.numeric(yearly_mean_bypoint_avg), y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_mean_temp_survey_facet_21_34, path = here::here("figures"), filename = "preds_sbt_mean_temp_survey_facet_21_34.jpg", height = 12, width =9)


#####MINIMUM TEMP
(preds_sbt_min_temp_survey_facet_1_20 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[1:20] & year > 1979]) +
  labs(x = "Minimum bottom temperature (˚C)",  y = "β-diversity") +
  geom_point(aes(x = as.numeric(yearly_min_bypoint_avg), y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = as.numeric(yearly_min_bypoint_avg), y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_min_temp_survey_facet_1_20, path = here::here("figures"), filename = "preds_sbt_min_temp_survey_facet_1_20.jpg", height = 12, width =9)


(preds_sbt_min_temp_survey_facet_21_34 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard[survey_unit %in% all_surveys[21:34] & year > 1979]) +
  labs(x = "Minimum bottom temperature (˚C)",  y = "β-diversity") +
  geom_point(aes(x = as.numeric(yearly_min_bypoint_avg), y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = as.numeric(yearly_min_bypoint_avg), y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_min_temp_survey_facet_21_34, path = here::here("figures"), filename = "preds_sbt_min_temp_survey_facet_21_34.jpg", height = 12, width =9)


#######FISHING

dissimilarities_temp_fishing_area.jaccard.cc <- dissimilarities_temp_fishing_area.jaccard[complete.cases(dissimilarities_temp_fishing_area.jaccard[,summed_tonnes_scaled_byreg]),]

(preds_sbt_mean_fishing_survey_facet_1_20 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard.cc[survey_unit %in% all_surveys[1:20] & year > 1979]) +
  labs(x = "Relative fishing catch",  y = "β-diversity") +
  geom_point(aes(x = summed_tonnes_scaled_byreg, y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = summed_tonnes_scaled_byreg, y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_mean_fishing_survey_facet_1_20, path = here::here("figures"), filename = "preds_sbt_mean_fishing_survey_facet_1_20.jpg", height = 12, width =9)


(preds_sbt_mean_fishing_survey_facet_21_34 <- ggplot(data = dissimilarities_temp_fishing_area.jaccard.cc[survey_unit %in% all_surveys[c(21:34)] & year > 1979]) +
  labs(x = "Relative fishing catch",  y = "β-diversity") +
  geom_point(aes(x = summed_tonnes_scaled_byreg, y = annual_dissimilarity_value), alpha = 0.3) +
  geom_smooth(aes(x = summed_tonnes_scaled_byreg, y = annual_dissimilarity_value), method = "lm") +
  facet_wrap(~Survey_Name_Season, scales= "free", ncol = 4) +
  theme_classic())

ggsave(preds_sbt_mean_fishing_survey_facet_21_34, path = here::here("figures"), filename = "preds_sbt_mean_fishing_survey_facet_21_34.jpg", height = 12, width =9)

NA
NA

###Plot number of tows per year per region

tows_year <- unique(dissimilarities_temp_fishing_area.jaccard[,.(survey_unit, haul_id_count_annual, area_km, year, Survey_Name_Season)])

min_haul_density <- min(tows_year$haul_id_count_annual/tows_year$area_km)
max_haul_density <- max(tows_year$haul_id_count_annual/tows_year$area_km)

(tow_density_survey_facet_1_20 <- ggplot(data = tows_year[survey_unit %in% all_surveys[1:20]]) +
  labs(x = "Year",  y = expression("Tow density (tows per km"^2*")")) +
  geom_point(aes(x = year, y = haul_id_count_annual/area_km)) +
  ylim(c(min_haul_density-0.0001, max_haul_density+0.0001)) +
  facet_wrap(~Survey_Name_Season, ncol = 4) +
  theme_classic())

ggsave(tow_density_survey_facet_1_20, path = here::here("figures"), filename = "tow_density_survey_facet_1_20.jpg", height = 12, width =9)


(tow_density_survey_facet_21_34 <- ggplot(data = tows_year[survey_unit %in% all_surveys[21:34]]) +
  labs(x = "Year",  y = expression("Tow density (tows per km"^2*")")) +
  geom_point(aes(x = year, y = haul_id_count_annual/area_km)) +
  ylim(c(min_haul_density-0.0001, max_haul_density+0.0001)) +
  facet_wrap(~Survey_Name_Season, ncol = 4) +
  theme_classic())

ggsave(tow_density_survey_facet_21_34, path = here::here("figures"), filename = "tow_density_survey_facet_21_34.jpg", height = 12, width =9)

#minimum and maximum dissimilarity value
min_dissimilarity <- min(dissimilarities_temp_fishing_area.jaccard$annual_dissimilarity_value)
max_dissimilarity <- max(dissimilarities_temp_fishing_area.jaccard$annual_dissimilarity_value)

#how does tow density vary with dissimilarity?
tow_density_dissimilarity_1_20 <- 
  ggplot(data = dissimilarities_temp_fishing_area.jaccard[dissimilarity_metric == "jaccard_dissimilarity_index_binary" & survey_unit %in% all_surveys[1:20]]) +
  geom_point(aes(x = (haul_id_count_annual/area_km), y = annual_dissimilarity_value, color = year), size = 2) +
  viridis::scale_color_viridis() +
  facet_wrap(~Survey_Name_Season, ncol = 4, scales = "free") +
  labs(x = expression("Tow density (tows per km"^2*")"), y = "β-diversity", color = "Year") +
   # xlim(c(min_haul_density-0.0001, max_haul_density+0.0001)) +
   # ylim(c(min_dissimilarity-0.01,max_dissimilarity+0.01)) +
  theme_classic() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))

ggsave(tow_density_dissimilarity_1_20, path = here::here("figures"), filename = "tow_density_dissimilarity_1_20.jpg", height = 12, width =9)

tow_density_dissimilarity_21_34 <- 
  ggplot(data = dissimilarities_temp_fishing_area.jaccard[dissimilarity_metric == "jaccard_dissimilarity_index_binary" & survey_unit %in% all_surveys[21:34]]) +
  geom_point(aes(x = (haul_id_count_annual/area_km), y = annual_dissimilarity_value, color = year), size = 2) +
  viridis::scale_color_viridis() +
  facet_wrap(~Survey_Name_Season, ncol = 4, scales = "free") +
  labs(x = expression("Tow density (tows per km"^2*")"), y = "β-diversity", color = "Year") +
   # xlim(c(min_haul_density-0.0001, max_haul_density+0.0001)) +
   # ylim(c(min_dissimilarity-0.01,max_dissimilarity+0.01)) +
  theme_classic() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))

ggsave(tow_density_dissimilarity_21_34, path = here::here("figures"), filename = "tow_density_dissimilarity_21_34.jpg", height = 12, width =9)



#Plot all at once?
tow_density_dissimilarity <- 
  ggplot(data = dissimilarities_temp_fishing_area.jaccard[dissimilarity_metric == "jaccard_dissimilarity_index_binary"]) +
  geom_point(aes(x = (haul_id_count_annual/area_km), y = annual_dissimilarity_value, color = Survey_Name_Season), size = 2) +
  scale_color_manual(values = color_link$hex) +
  labs(x = expression("Tow density (tows per km"^2*")"), y = "β-diversity", color = "Year") +
   # xlim(c(min_haul_density-0.0001, max_haul_density+0.0001)) +
   # ylim(c(min_dissimilarity-0.01,max_dissimilarity+0.01)) +
  theme_classic()

#and by numbers?
result <- dissimilarities_temp_fishing_area.jaccard[, .(max_density = max(haul_id_count_annual/area_km, na.rm = TRUE), 
                 min_density = min(haul_id_count_annual/area_km, na.rm = TRUE)), 
             by = Survey_Name_Season]

result[,range:= max_density-min_density]

ggplot(data = result) +
  geom_point(aes(x = Survey_Name_Season, y = range)) +
  theme_classic() +
  labs(x = "",y = "Range of tow density values in tow/km^2") +
  theme(axis.text.x = element_text(angle = 45, hjust=1))

Plot dissimilarity by season of sampling

dissimilarities_temp_fishing_area.jaccard[,season := factor(season, levels = c("Spring","Summer","Fall","Winter"))]

ggplot(dissimilarities_temp_fishing_area.jaccard) +
  geom_boxplot(aes(x = season, y = annual_dissimilarity_value)) +
  theme_classic()

###Set up dredge to identify best performing models

First, make data table of model covariates


options(na.action = "na.fail")

dissimilarity_covariates_dredge.dt <- dissimilarities_temp_fishing_area.jaccard[,.
                  (year, survey_unit,
                    yearly_mean_bypoint_avg, yearly_max_bypoint_avg, yearly_min_bypoint_avg,yearly_seas_bypoint_avg,
                    yearly_mean_bypoint_SD, yearly_max_bypoint_SD, yearly_min_bypoint_SD,yearly_seas_bypoint_SD,
                    yearly_mean_bypoint_avg.s, yearly_max_bypoint_avg.s, yearly_min_bypoint_avg.s,yearly_seas_bypoint_avg.s,
                    annual_dissimilarity_value,
                    haul_id_count_annual,
                    spp_count_annual, depth_annual_avg,
                    depth_annual_range, latitude_annual_avg,
                    latitude_annual_range, area_km, season, summed_tonnes_scaled_byreg)]

#merge in with colors for plotting predictions by survey
dissimilarity_covariates_dredge.dt <- color_link[dissimilarity_covariates_dredge.dt, on = "survey_unit"]

#If NA for any covariate, delete row
#View(dissimilarity_covariates_dredge.dt)
#Deleted:
  #Before 1980 and after 2019
  #Gulf of Saint Laurence South (no depth data)
  #No clear SAU match for Rockall Plateau
dissimilarity_covariates_dredge.dt <- dissimilarity_covariates_dredge.dt[complete.cases(dissimilarity_covariates_dredge.dt)]

#Scale and center variables that are not yet scaled and centered
dissimilarity_covariates_dredge.dt[, yearly_mean_bypoint_avg.scaledacrossall := scale(yearly_mean_bypoint_avg)][, yearly_mean_bypoint_SD.scaledacrossall := scale(yearly_mean_bypoint_SD)][, yearly_min_bypoint_avg.scaledacrossall := scale(yearly_min_bypoint_avg)][, yearly_max_bypoint_avg.scaledacrossall := scale(yearly_max_bypoint_avg)][, yearly_seas_bypoint_avg.scaledacrossall := scale(yearly_seas_bypoint_avg)][,haul_id_count_annual.scaledacrossall := scale(haul_id_count_annual)][,spp_count_annual.scaledacrossall := scale(spp_count_annual)][,depth_annual_avg.scaledacrossall := scale(depth_annual_avg)][,depth_annual_range.scaledacrossall := scale(depth_annual_range)] [,latitude_annual_avg.scaledacrossall := scale(latitude_annual_avg)][,latitude_annual_range.scaledacrossall := scale(latitude_annual_range)][,area_km.scaledacrossall := scale(area_km)]
####Global model contenders
temp * survey_unit + fishing * survey_unit + area + latitude range + latitude average + depth range + depth average + spp count + # of hauls + season + AR for year (optional, will see if this performs better or worse with AR1)

For temperature, we will compare performance of: -mean (scaled across all regions) -max (scaled across all regions) -min (scaled across all regions) -seas (scaled across all regions) -SD (scaled across all regions)

Comparing temp variables AND the presence/absence of a temporal autocorrelation term


#mean temperature
global_mod_mean_temp_lm <- lm(annual_dissimilarity_value ~ 
                             survey_unit*yearly_mean_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                             season,
                             data = dissimilarity_covariates_dredge.dt)

#with temporal autocorrelation
global_mod_mean_temp_gls <- gls(annual_dissimilarity_value ~ 
                             survey_unit*yearly_mean_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                            season,
                           correlation = corAR1(form=~year | survey_unit),
                             data = dissimilarity_covariates_dredge.dt)
#maximum temperature
global_mod_max_temp_lm <- lm(annual_dissimilarity_value ~ 
                             survey_unit*yearly_max_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                            season,
                             data = dissimilarity_covariates_dredge.dt)

#with temporal autocorrelation
global_mod_max_temp_gls <-gls(annual_dissimilarity_value ~ 
                             survey_unit*yearly_max_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                            season,
                            correlation = corAR1(form=~year | survey_unit),
                             data = dissimilarity_covariates_dredge.dt)
#minimum temperature
global_mod_min_temp_lm <- lm(annual_dissimilarity_value ~ 
                             survey_unit*yearly_min_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                            season,
                             data = dissimilarity_covariates_dredge.dt)

dissimilarity_covariates_dredge.dt[, survey_unit := factor(survey_unit, levels = sort(all_surveys))]

#with temporal autocorrelation
global_mod_min_temp_gls <-gls(annual_dissimilarity_value ~ 
                             survey_unit*yearly_min_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                            season,
                            correlation = corAR1(form=~year | survey_unit),
                             data = dissimilarity_covariates_dredge.dt)

#temperature seasonality
global_mod_seas_temp_lm <- lm(annual_dissimilarity_value ~ 
                             survey_unit*yearly_seas_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                             season,
                             data = dissimilarity_covariates_dredge.dt)

#with temporal autocorrelation
global_mod_seas_temp_gls <- gls(annual_dissimilarity_value ~ 
                             survey_unit*yearly_seas_bypoint_avg.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                             season,
                             correlation = corAR1(form=~year | survey_unit),
                             data = dissimilarity_covariates_dredge.dt)

#standard deviation
global_mod_SD_temp_lm <- lm(annual_dissimilarity_value ~ 
                             survey_unit*yearly_mean_bypoint_SD.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                           season,
                             data = dissimilarity_covariates_dredge.dt)

#with temporal autocorrelation
global_mod_SD_temp_gls <- gls(annual_dissimilarity_value ~ 
                             survey_unit*yearly_mean_bypoint_SD.scaledacrossall + #temp and survey unit (possible interaction)
                             survey_unit*summed_tonnes_scaled_byreg + #fishing effort and survey unit (possible interaction)
                             area_km.scaledacrossall + #area
                             latitude_annual_range.scaledacrossall + #latitude range
                             latitude_annual_avg.scaledacrossall + #latitude avg
                             depth_annual_range.scaledacrossall + #depth range
                             depth_annual_avg.scaledacrossall + #depth avg
                             spp_count_annual.scaledacrossall + #spp #
                             haul_id_count_annual.scaledacrossall +
                           season,
                              correlation = corAR1(form=~year | survey_unit),
                             data = dissimilarity_covariates_dredge.dt)

#Compare AICcs
View(AICc(global_mod_mean_temp_lm, global_mod_max_temp_lm, global_mod_min_temp_lm, global_mod_seas_temp_lm, global_mod_SD_temp_lm,
          global_mod_mean_temp_gls, global_mod_max_temp_gls, global_mod_min_temp_gls, global_mod_seas_temp_gls, global_mod_SD_temp_gls))

#build data table to report AICc
global_mod_temp_table <- data.table(
  `Temporal autocorrelation` = c(
    c(rep(F,5),rep(T,5))
  ),
  `Temperature variable` = rep(c(                  
              "Average mean SBT",
              "Average maximum SBT",                        
              "Average minimum SBT",                  
              "Average SBT seasonality",                 
              "SBT SD"),2),
  deltaAICc = signif(min(AICc(global_mod_mean_temp_lm, global_mod_max_temp_lm, global_mod_min_temp_lm, global_mod_seas_temp_lm, global_mod_SD_temp_lm,
          global_mod_mean_temp_gls, global_mod_max_temp_gls, global_mod_min_temp_gls, global_mod_seas_temp_gls, global_mod_SD_temp_gls)[,2])-AICc(global_mod_mean_temp_lm, global_mod_max_temp_lm, global_mod_min_temp_lm, global_mod_seas_temp_lm, global_mod_SD_temp_lm,
          global_mod_mean_temp_gls, global_mod_max_temp_gls, global_mod_min_temp_gls, global_mod_seas_temp_gls, global_mod_SD_temp_gls)[,2],2))

#order by aicc
setorder(global_mod_temp_table,cols = -"deltaAICc")

global_mod_temp_table[,Rank := seq(1,10,by = 1)]

global_mod_sbt_table <- global_mod_temp_table[,.(Rank,`Temporal autocorrelation`,`Temperature variable`, deltaAICc)]

fwrite(global_mod_sbt_table, here::here("output","global_mod_sbt_table.csv"))

####Best performing global model includes minimum temperature (centered and scaled) (Still the case as of July 17, 2024)

Now, look at different combinations of all predictors (min temp) using dredge

Global model: global_mod_min_temp

r2_temp_and_fishing_exclude
[1] 0.929036

###Predict dissimilarity across years using averaged model (model_avg_delta4)

dissimilarity_covariates_dredge.dt_predictions <- copy(dissimilarity_covariates_dredge.dt)

  #allowing temp and fishing to vary (aka no changes)
  dissimilarity_covariates_dredge.dt_predictions[,pred_dissim := predict(model_avg_delta4, se.fit = T, full = F)[[1]]][,pred_se := predict(model_avg_delta4, se.fit = T, full = F)[[2]]] #full allows us to switch back to mixed effect models
Warning: argument 'full' ignoredWarning: argument 'full' ignored
  #What's the R^2 value?
  r.squaredGLMM(lm(data = dissimilarity_covariates_dredge.dt_predictions, annual_dissimilarity_value ~ pred_dissim))
Warning: 'r.squaredGLMM' now calculates a revised statistic. See the help page.
           R2m       R2c
[1,] 0.9458501 0.9458501
  #R2 = 0.9458501
  
  #constant temp in regions (aka take mean of temperature values within survey units so they are the same value within each year for a survey)
  dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg <- copy(dissimilarity_covariates_dredge.dt)
  dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg[,yearly_min_bypoint_avg.scaledacrossall:=mean(yearly_min_bypoint_avg.scaledacrossall),.(survey_unit)]
  dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg[,pred_dissim := predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg)[[1]]][,pred_se := predict(model_avg_delta4, se.fit = T, full = F)[[2]]]
Warning: argument 'full' ignoredWarning: argument 'full' ignored
  
    #What's the R^2 value?
  r.squaredGLMM(lm(data = dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg, annual_dissimilarity_value ~ pred_dissim))
           R2m       R2c
[1,] 0.9370433 0.9370433
  #R2 = 0.9370433 (only fishing!!)

  #constant fishing in regions (aka take mean of fishing values within survey units so they are the same value within each year for a survey)
  dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg <- copy(dissimilarity_covariates_dredge.dt)
  dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg[,summed_tonnes_scaled_byreg:=mean(summed_tonnes_scaled_byreg),.(survey_unit)]
  
    dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg[,pred_dissim := predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg)[[1]]][,pred_se := predict(model_avg_delta4, se.fit = T, full = F)[[2]]]
Warning: argument 'full' ignoredWarning: argument 'full' ignored
  
    #What's the R^2 value?
  r.squaredGLMM(lm(data = dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg, annual_dissimilarity_value ~ pred_dissim))
          R2m      R2c
[1,] 0.935642 0.935642
  #R2 = 0.935642 (only temperature!!)

#and then with consistent temp and fishing in regions (aka take mean of both min temp and fishing)
dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg <- copy(dissimilarity_covariates_dredge.dt)
dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg[,summed_tonnes_scaled_byreg:=mean(summed_tonnes_scaled_byreg),.(survey_unit)][,yearly_min_bypoint_avg.scaledacrossall:=mean(yearly_min_bypoint_avg.scaledacrossall),.(survey_unit)]

    dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg[,pred_dissim := predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg)[[1]]][,pred_se := predict(model_avg_delta4, se.fit = T, full = F)[[2]]]
Warning: argument 'full' ignoredWarning: argument 'full' ignored
  
    #What's the R^2 value?
  r.squaredGLMM(lm(data = dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg, annual_dissimilarity_value ~ pred_dissim))
           R2m       R2c
[1,] 0.9288549 0.9288549
  #R2 = 0.9288549 (only other variables!!! not temp or fishing)


#allowing temp and fishing to vary within regs (normal)
    dissimilarity_covariates_dredge.dt_predictions[,pred_dissim := 
                                                     predict(model_avg_delta4, se.fit = T, full = F, newdata =   dissimilarity_covariates_dredge.dt_predictions)[[1]]][,pred_se := 
                                                                                                                                                                         predict(model_avg_delta4, se.fit = T, full = F, newdata =   dissimilarity_covariates_dredge.dt_predictions)[[2]]]
Warning: argument 'full' ignoredWarning: argument 'full' ignored
  
#allowing only fishing to vary within regions (with mean temp)
  
   dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg[,pred_dissim := 
                                                                        predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg)[[1]]][,pred_se :=
                                                                                                                                                                                                              predict(model_avg_delta4, se.fit = T, full = F, newdata = dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg)[[2]]]
Warning: argument 'full' ignoredWarning: argument 'full' ignored
#FOR COLOR TO MATCH
#sort color link by survey name season
#alphabetical order
color_link_alpha <- setorder(color_link, survey_unit)

#exclude surveys we don't include
color_link_alpha <- color_link_alpha[survey_unit %in% unique(dissimilarity_covariates_dredge.dt_predictions$survey_unit),]

color_alpha_order <- color_link_alpha[,hex]
label_alpha_order <- color_link_alpha[,Survey_Name_Season]
  
# 
# #maintain temp and fishing
# #plot
# predicted_values_temp_fishing <- ggplot(dissimilarity_covariates_dredge.dt_predictions) +
#   geom_point(aes(x = year, y = annual_dissimilarity_value, color = survey_unit)) +
#   geom_line(aes(x = year, y = pred_dissim, color = survey_unit)) +
#   geom_ribbon(aes(x = year, ymin = pred_dissim-pred_se, ymax = pred_dissim+pred_se, fill = survey_unit), alpha = 0.3) +
#   scale_color_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
#   scale_fill_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
#   labs(x = "Year",y = "Average annual total\nBray Curtis dissimilarity") +
#   ylim(0,1.5) +
#   theme_classic() +
#   ggtitle("Average model predictions")
# 
# #average temp and fishing for each region
# predicted_values_temp_fishing_meantempfishinginsurvey <- ggplot(dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg) +
#   geom_point(aes(x = year, y = annual_dissimilarity_value, color = survey_unit)) +
#   geom_line(aes(x = year, y = pred_dissim, color = survey_unit)) +
#   geom_ribbon(aes(x = year, ymin = pred_dissim-pred_se, ymax = pred_dissim+pred_se, fill = survey_unit), alpha = 0.3) +
#   scale_color_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
#   scale_fill_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
#   labs(x = "Year",y = "Average annual total\nBray Curtis dissimilarity") +
#   ylim(0,1.5) +
#   theme_classic() +
#   ggtitle("Average model predictions with mean\nsurvey temperature and fishing pressure")
# 
# #average temp and fishing across all regions (#BROKEN NOT SURE WHAT'S HAPPENING HERE)
# predicted_values_temp_fishing_meantempfishing <- ggplot(dissimilarity_covariates_dredge.dt_predictions_consistenttempfishing) +
#   geom_point(aes(x = year, y = annual_dissimilarity_value, color = survey_unit)) +
#   geom_line(aes(x = year, y = pred_dissim, color = survey_unit)) +
#   geom_ribbon(aes(x = year, ymin = pred_dissim-pred_se, ymax = pred_dissim+pred_se, fill = survey_unit), alpha = 0.1) +
#   scale_color_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
#   scale_fill_manual(values = color_alpha_order, labels = label_alpha_order, name = "Survey") +
#   labs(x = "Year",y = "Average annual total\nBray Curtis dissimilarity") +
#   ylim(0,1.5) +
#   theme_classic() +
#   ggtitle("Average model predictions with mean\novereall temperature and fishing pressure")
# 
# #merge plots
# predicted_values_sbt_jaccard_fishing_merge <- cowplot::plot_grid(predicted_values_temp_fishing,
#                                                  predicted_values_temp_fishing_meantempfishinginsurvey,
#                                                  predicted_values_temp_fishing_meantempfishing,
#                                                  ncol = 1)
# 
# ggsave(predicted_values_sbt_jaccard_fishing_merge, path = here::here("figures"), filename = "predicted_values_sbt_jaccard_fishing_merge.jpg", height = 30, width = 14)

Take dissimilarity values from random normal distribution for each year for each region, and then calculate slope (1000 times). Do this for: - Fishing and temperature vary interannually within surveys - Temperature is held constant (as mean over time series for a survey), but fishing varies (allows us to look at relative variance explained) - Fishing is held constant (as mean over time series for a survey), but temperature varies (allows us to look at relative variance explained) - Both fishing and temperature held constant (allows us to see role of other components of the model)

################################################################################
#full predictions
################################################################################
#table with predicted dissimilarity values and standard error of all predicted dissimilarity values (by year)
table <- dissimilarity_covariates_dredge.dt_predictions[,.(survey_unit, pred_dissim, pred_se, year)]
#0) make datatable to populate
  predicted_dissim_trends_rnormruns <- data.table()
#1) NEW PREDICTED VALUES FROM DISTRIBUTION
for (i in 1:1000){
  table[,rnorm_pred := rnorm(1, mean = pred_dissim, sd = pred_se),.(year, survey_unit)]
#2) CALCULATE LINEAR MODEL TO EXTRACT SURVEY SPECIFIC TREND VALUES
  jaccard_total_predicted_lm_singlerun <- lm(rnorm_pred ~ year*survey_unit,data = table)

  model_coefs_reduced_predictions_singlerun <- data.table(summary(jaccard_total_predicted_lm_singlerun)$coefficients)
  model_coefs_reduced_predictions_singlerun[,var := rownames(summary(jaccard_total_predicted_lm_singlerun)$coefficients)]
  
  #limit to interactions only (check this if there are any model changes!) row 2 and rows 34:64
  model_coefs_reduced_predictions_singlerun <- model_coefs_reduced_predictions_singlerun[c(2,34:64),]
  
  #adjust survey unit name by deleting beginning of string
  model_coefs_reduced_predictions_singlerun[,survey_unit := substr(var, 17, str_length(var))][var == "year",survey_unit := "AI"]
  
  #calculate interaction coefficients
  AI_estimate <- model_coefs_reduced_predictions_singlerun[1,Estimate]
  model_coefs_reduced_predictions_singlerun[1,estimate := AI_estimate]
  model_coefs_reduced_predictions_singlerun[2:32,estimate := (AI_estimate + Estimate)]
  
  predicted_dissim_trends_rnormruns <- rbind(predicted_dissim_trends_rnormruns, model_coefs_reduced_predictions_singlerun[,.(survey_unit, estimate)])
  
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15
[1] 16
[1] 17
[1] 18
[1] 19
[1] 20
[1] 21
[1] 22
[1] 23
[1] 24
[1] 25
[1] 26
[1] 27
[1] 28
[1] 29
[1] 30
[1] 31
[1] 32
[1] 33
[1] 34
[1] 35
[1] 36
[1] 37
[1] 38
[1] 39
[1] 40
[1] 41
[1] 42
[1] 43
[1] 44
[1] 45
[1] 46
[1] 47
[1] 48
[1] 49
[1] 50
[1] 51
[1] 52
[1] 53
[1] 54
[1] 55
[1] 56
[1] 57
[1] 58
[1] 59
[1] 60
[1] 61
[1] 62
[1] 63
[1] 64
[1] 65
[1] 66
[1] 67
[1] 68
[1] 69
[1] 70
[1] 71
[1] 72
[1] 73
[1] 74
[1] 75
[1] 76
[1] 77
[1] 78
[1] 79
[1] 80
[1] 81
[1] 82
[1] 83
[1] 84
[1] 85
[1] 86
[1] 87
[1] 88
[1] 89
[1] 90
[1] 91
[1] 92
[1] 93
[1] 94
[1] 95
[1] 96
[1] 97
[1] 98
[1] 99
[1] 100
[1] 101
[1] 102
[1] 103
[1] 104
[1] 105
[1] 106
[1] 107
[1] 108
[1] 109
[1] 110
[1] 111
[1] 112
[1] 113
[1] 114
[1] 115
[1] 116
[1] 117
[1] 118
[1] 119
[1] 120
[1] 121
[1] 122
[1] 123
[1] 124
[1] 125
[1] 126
[1] 127
[1] 128
[1] 129
[1] 130
[1] 131
[1] 132
[1] 133
[1] 134
[1] 135
[1] 136
[1] 137
[1] 138
[1] 139
[1] 140
[1] 141
[1] 142
[1] 143
[1] 144
[1] 145
[1] 146
[1] 147
[1] 148
[1] 149
[1] 150
[1] 151
[1] 152
[1] 153
[1] 154
[1] 155
[1] 156
[1] 157
[1] 158
[1] 159
[1] 160
[1] 161
[1] 162
[1] 163
[1] 164
[1] 165
[1] 166
[1] 167
[1] 168
[1] 169
[1] 170
[1] 171
[1] 172
[1] 173
[1] 174
[1] 175
[1] 176
[1] 177
[1] 178
[1] 179
[1] 180
[1] 181
[1] 182
[1] 183
[1] 184
[1] 185
[1] 186
[1] 187
[1] 188
[1] 189
[1] 190
[1] 191
[1] 192
[1] 193
[1] 194
[1] 195
[1] 196
[1] 197
[1] 198
[1] 199
[1] 200
[1] 201
[1] 202
[1] 203
[1] 204
[1] 205
[1] 206
[1] 207
[1] 208
[1] 209
[1] 210
[1] 211
[1] 212
[1] 213
[1] 214
[1] 215
[1] 216
[1] 217
[1] 218
[1] 219
[1] 220
[1] 221
[1] 222
[1] 223
[1] 224
[1] 225
[1] 226
[1] 227
[1] 228
[1] 229
[1] 230
[1] 231
[1] 232
[1] 233
[1] 234
[1] 235
[1] 236
[1] 237
[1] 238
[1] 239
[1] 240
[1] 241
[1] 242
[1] 243
[1] 244
[1] 245
[1] 246
[1] 247
[1] 248
[1] 249
[1] 250
[1] 251
[1] 252
[1] 253
[1] 254
[1] 255
[1] 256
[1] 257
[1] 258
[1] 259
[1] 260
[1] 261
[1] 262
[1] 263
[1] 264
[1] 265
[1] 266
[1] 267
[1] 268
[1] 269
[1] 270
[1] 271
[1] 272
[1] 273
[1] 274
[1] 275
[1] 276
[1] 277
[1] 278
[1] 279
[1] 280
[1] 281
[1] 282
[1] 283
[1] 284
[1] 285
[1] 286
[1] 287
[1] 288
[1] 289
[1] 290
[1] 291
[1] 292
[1] 293
[1] 294
[1] 295
[1] 296
[1] 297
[1] 298
[1] 299
[1] 300
[1] 301
[1] 302
[1] 303
[1] 304
[1] 305
[1] 306
[1] 307
[1] 308
[1] 309
[1] 310
[1] 311
[1] 312
[1] 313
[1] 314
[1] 315
[1] 316
[1] 317
[1] 318
[1] 319
[1] 320
[1] 321
[1] 322
[1] 323
[1] 324
[1] 325
[1] 326
[1] 327
[1] 328
[1] 329
[1] 330
[1] 331
[1] 332
[1] 333
[1] 334
[1] 335
[1] 336
[1] 337
[1] 338
[1] 339
[1] 340
[1] 341
[1] 342
[1] 343
[1] 344
[1] 345
[1] 346
[1] 347
[1] 348
[1] 349
[1] 350
[1] 351
[1] 352
[1] 353
[1] 354
[1] 355
[1] 356
[1] 357
[1] 358
[1] 359
[1] 360
[1] 361
[1] 362
[1] 363
[1] 364
[1] 365
[1] 366
[1] 367
[1] 368
[1] 369
[1] 370
[1] 371
[1] 372
[1] 373
[1] 374
[1] 375
[1] 376
[1] 377
[1] 378
[1] 379
[1] 380
[1] 381
[1] 382
[1] 383
[1] 384
[1] 385
[1] 386
[1] 387
[1] 388
[1] 389
[1] 390
[1] 391
[1] 392
[1] 393
[1] 394
[1] 395
[1] 396
[1] 397
[1] 398
[1] 399
[1] 400
[1] 401
[1] 402
[1] 403
[1] 404
[1] 405
[1] 406
[1] 407
[1] 408
[1] 409
[1] 410
[1] 411
[1] 412
[1] 413
[1] 414
[1] 415
[1] 416
[1] 417
[1] 418
[1] 419
[1] 420
[1] 421
[1] 422
[1] 423
[1] 424
[1] 425
[1] 426
[1] 427
[1] 428
[1] 429
[1] 430
[1] 431
[1] 432
[1] 433
[1] 434
[1] 435
[1] 436
[1] 437
[1] 438
[1] 439
[1] 440
[1] 441
[1] 442
[1] 443
[1] 444
[1] 445
[1] 446
[1] 447
[1] 448
[1] 449
[1] 450
[1] 451
[1] 452
[1] 453
[1] 454
[1] 455
[1] 456
[1] 457
[1] 458
[1] 459
[1] 460
[1] 461
[1] 462
[1] 463
[1] 464
[1] 465
[1] 466
[1] 467
[1] 468
[1] 469
[1] 470
[1] 471
[1] 472
[1] 473
[1] 474
[1] 475
[1] 476
[1] 477
[1] 478
[1] 479
[1] 480
[1] 481
[1] 482
[1] 483
[1] 484
[1] 485
[1] 486
[1] 487
[1] 488
[1] 489
[1] 490
[1] 491
[1] 492
[1] 493
[1] 494
[1] 495
[1] 496
[1] 497
[1] 498
[1] 499
[1] 500
[1] 501
[1] 502
[1] 503
[1] 504
[1] 505
[1] 506
[1] 507
[1] 508
[1] 509
[1] 510
[1] 511
[1] 512
[1] 513
[1] 514
[1] 515
[1] 516
[1] 517
[1] 518
[1] 519
[1] 520
[1] 521
[1] 522
[1] 523
[1] 524
[1] 525
[1] 526
[1] 527
[1] 528
[1] 529
[1] 530
[1] 531
[1] 532
[1] 533
[1] 534
[1] 535
[1] 536
[1] 537
[1] 538
[1] 539
[1] 540
[1] 541
[1] 542
[1] 543
[1] 544
[1] 545
[1] 546
[1] 547
[1] 548
[1] 549
[1] 550
[1] 551
[1] 552
[1] 553
[1] 554
[1] 555
[1] 556
[1] 557
[1] 558
[1] 559
[1] 560
[1] 561
[1] 562
[1] 563
[1] 564
[1] 565
[1] 566
[1] 567
[1] 568
[1] 569
[1] 570
[1] 571
[1] 572
[1] 573
[1] 574
[1] 575
[1] 576
[1] 577
[1] 578
[1] 579
[1] 580
[1] 581
[1] 582
[1] 583
[1] 584
[1] 585
[1] 586
[1] 587
[1] 588
[1] 589
[1] 590
[1] 591
[1] 592
[1] 593
[1] 594
[1] 595
[1] 596
[1] 597
[1] 598
[1] 599
[1] 600
[1] 601
[1] 602
[1] 603
[1] 604
[1] 605
[1] 606
[1] 607
[1] 608
[1] 609
[1] 610
[1] 611
[1] 612
[1] 613
[1] 614
[1] 615
[1] 616
[1] 617
[1] 618
[1] 619
[1] 620
[1] 621
[1] 622
[1] 623
[1] 624
[1] 625
[1] 626
[1] 627
[1] 628
[1] 629
[1] 630
[1] 631
[1] 632
[1] 633
[1] 634
[1] 635
[1] 636
[1] 637
[1] 638
[1] 639
[1] 640
[1] 641
[1] 642
[1] 643
[1] 644
[1] 645
[1] 646
[1] 647
[1] 648
[1] 649
[1] 650
[1] 651
[1] 652
[1] 653
[1] 654
[1] 655
[1] 656
[1] 657
[1] 658
[1] 659
[1] 660
[1] 661
[1] 662
[1] 663
[1] 664
[1] 665
[1] 666
[1] 667
[1] 668
[1] 669
[1] 670
[1] 671
[1] 672
[1] 673
[1] 674
[1] 675
[1] 676
[1] 677
[1] 678
[1] 679
[1] 680
[1] 681
[1] 682
[1] 683
[1] 684
[1] 685
[1] 686
[1] 687
[1] 688
[1] 689
[1] 690
[1] 691
[1] 692
[1] 693
[1] 694
[1] 695
[1] 696
[1] 697
[1] 698
[1] 699
[1] 700
[1] 701
[1] 702
[1] 703
[1] 704
[1] 705
[1] 706
[1] 707
[1] 708
[1] 709
[1] 710
[1] 711
[1] 712
[1] 713
[1] 714
[1] 715
[1] 716
[1] 717
[1] 718
[1] 719
[1] 720
[1] 721
[1] 722
[1] 723
[1] 724
[1] 725
[1] 726
[1] 727
[1] 728
[1] 729
[1] 730
[1] 731
[1] 732
[1] 733
[1] 734
[1] 735
[1] 736
[1] 737
[1] 738
[1] 739
[1] 740
[1] 741
[1] 742
[1] 743
[1] 744
[1] 745
[1] 746
[1] 747
[1] 748
[1] 749
[1] 750
[1] 751
[1] 752
[1] 753
[1] 754
[1] 755
[1] 756
[1] 757
[1] 758
[1] 759
[1] 760
[1] 761
[1] 762
[1] 763
[1] 764
[1] 765
[1] 766
[1] 767
[1] 768
[1] 769
[1] 770
[1] 771
[1] 772
[1] 773
[1] 774
[1] 775
[1] 776
[1] 777
[1] 778
[1] 779
[1] 780
[1] 781
[1] 782
[1] 783
[1] 784
[1] 785
[1] 786
[1] 787
[1] 788
[1] 789
[1] 790
[1] 791
[1] 792
[1] 793
[1] 794
[1] 795
[1] 796
[1] 797
[1] 798
[1] 799
[1] 800
[1] 801
[1] 802
[1] 803
[1] 804
[1] 805
[1] 806
[1] 807
[1] 808
[1] 809
[1] 810
[1] 811
[1] 812
[1] 813
[1] 814
[1] 815
[1] 816
[1] 817
[1] 818
[1] 819
[1] 820
[1] 821
[1] 822
[1] 823
[1] 824
[1] 825
[1] 826
[1] 827
[1] 828
[1] 829
[1] 830
[1] 831
[1] 832
[1] 833
[1] 834
[1] 835
[1] 836
[1] 837
[1] 838
[1] 839
[1] 840
[1] 841
[1] 842
[1] 843
[1] 844
[1] 845
[1] 846
[1] 847
[1] 848
[1] 849
[1] 850
[1] 851
[1] 852
[1] 853
[1] 854
[1] 855
[1] 856
[1] 857
[1] 858
[1] 859
[1] 860
[1] 861
[1] 862
[1] 863
[1] 864
[1] 865
[1] 866
[1] 867
[1] 868
[1] 869
[1] 870
[1] 871
[1] 872
[1] 873
[1] 874
[1] 875
[1] 876
[1] 877
[1] 878
[1] 879
[1] 880
[1] 881
[1] 882
[1] 883
[1] 884
[1] 885
[1] 886
[1] 887
[1] 888
[1] 889
[1] 890
[1] 891
[1] 892
[1] 893
[1] 894
[1] 895
[1] 896
[1] 897
[1] 898
[1] 899
[1] 900
[1] 901
[1] 902
[1] 903
[1] 904
[1] 905
[1] 906
[1] 907
[1] 908
[1] 909
[1] 910
[1] 911
[1] 912
[1] 913
[1] 914
[1] 915
[1] 916
[1] 917
[1] 918
[1] 919
[1] 920
[1] 921
[1] 922
[1] 923
[1] 924
[1] 925
[1] 926
[1] 927
[1] 928
[1] 929
[1] 930
[1] 931
[1] 932
[1] 933
[1] 934
[1] 935
[1] 936
[1] 937
[1] 938
[1] 939
[1] 940
[1] 941
[1] 942
[1] 943
[1] 944
[1] 945
[1] 946
[1] 947
[1] 948
[1] 949
[1] 950
[1] 951
[1] 952
[1] 953
[1] 954
[1] 955
[1] 956
[1] 957
[1] 958
[1] 959
[1] 960
[1] 961
[1] 962
[1] 963
[1] 964
[1] 965
[1] 966
[1] 967
[1] 968
[1] 969
[1] 970
[1] 971
[1] 972
[1] 973
[1] 974
[1] 975
[1] 976
[1] 977
[1] 978
[1] 979
[1] 980
[1] 981
[1] 982
[1] 983
[1] 984
[1] 985
[1] 986
[1] 987
[1] 988
[1] 989
[1] 990
[1] 991
[1] 992
[1] 993
[1] 994
[1] 995
[1] 996
[1] 997
[1] 998
[1] 999
[1] 1000
  
#reduce to mean and standard deviation
predicted_dissim_trends_rnormruns[,mean_dissim_coef:= mean(estimate),survey_unit][,sd_dissim := sd(estimate),.(survey_unit)]

predicted_dissim_trends_rnormruns.summary <- unique(predicted_dissim_trends_rnormruns[,.(survey_unit, mean_dissim_coef, sd_dissim)])

predicted_dissim_trends_rnormruns.summary[,pred_type := "full"]

################################################################################
#predictions with temp held constant and fishing still varying from year to year
################################################################################
#table with predicted dissimilarity values and standard error of all predicted dissimilarity values (by year)
table_constanttemp <- dissimilarity_covariates_dredge.dt_predictions_consistenttempinreg[,.(survey_unit, pred_dissim, pred_se, year)]
#0) make datatable to populate
  predicted_dissim_trends_rnormruns_constanttemp <- data.table()
#1) NEW PREDICTED VALUES FROM DISTRIBUTION
for (i in 1:1000){
  table_constanttemp[,rnorm_pred := rnorm(1, mean = pred_dissim, sd = pred_se),.(year, survey_unit)]
#2) CALCULATE LINEAR MODEL FOR SLOPE VALUES
  jaccard_total_predicted_lm_singlerun_constanttemp <- lm(rnorm_pred ~ year*survey_unit,data = table_constanttemp)

  model_coefs_reduced_predictions_singlerun_constanttemp <- data.table(summary(jaccard_total_predicted_lm_singlerun_constanttemp)$coefficients)
  model_coefs_reduced_predictions_singlerun_constanttemp[,var := rownames(summary(jaccard_total_predicted_lm_singlerun_constanttemp)$coefficients)]
  
  #limit to interactions only (check this if there are any model changes!) row 2 and rows 34:64
  model_coefs_reduced_predictions_singlerun_constanttemp <- model_coefs_reduced_predictions_singlerun_constanttemp[c(2,34:64),]
  
  #adjust survey unit name by deleting beginning of string
  model_coefs_reduced_predictions_singlerun_constanttemp[,survey_unit := substr(var, 17, str_length(var))][var == "year",survey_unit := "AI"]
  
  #calculate interaction coefficients
  AI_estimate <- model_coefs_reduced_predictions_singlerun_constanttemp[1,Estimate]
  model_coefs_reduced_predictions_singlerun_constanttemp[1,estimate := AI_estimate]
  model_coefs_reduced_predictions_singlerun_constanttemp[2:32,estimate := (AI_estimate + Estimate)]
  
  predicted_dissim_trends_rnormruns_constanttemp <- rbind(predicted_dissim_trends_rnormruns_constanttemp, model_coefs_reduced_predictions_singlerun_constanttemp[,.(survey_unit, estimate)])
  
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15
[1] 16
[1] 17
[1] 18
[1] 19
[1] 20
[1] 21
[1] 22
[1] 23
[1] 24
[1] 25
[1] 26
[1] 27
[1] 28
[1] 29
[1] 30
[1] 31
[1] 32
[1] 33
[1] 34
[1] 35
[1] 36
[1] 37
[1] 38
[1] 39
[1] 40
[1] 41
[1] 42
[1] 43
[1] 44
[1] 45
[1] 46
[1] 47
[1] 48
[1] 49
[1] 50
[1] 51
[1] 52
[1] 53
[1] 54
[1] 55
[1] 56
[1] 57
[1] 58
[1] 59
[1] 60
[1] 61
[1] 62
[1] 63
[1] 64
[1] 65
[1] 66
[1] 67
[1] 68
[1] 69
[1] 70
[1] 71
[1] 72
[1] 73
[1] 74
[1] 75
[1] 76
[1] 77
[1] 78
[1] 79
[1] 80
[1] 81
[1] 82
[1] 83
[1] 84
[1] 85
[1] 86
[1] 87
[1] 88
[1] 89
[1] 90
[1] 91
[1] 92
[1] 93
[1] 94
[1] 95
[1] 96
[1] 97
[1] 98
[1] 99
[1] 100
[1] 101
[1] 102
[1] 103
[1] 104
[1] 105
[1] 106
[1] 107
[1] 108
[1] 109
[1] 110
[1] 111
[1] 112
[1] 113
[1] 114
[1] 115
[1] 116
[1] 117
[1] 118
[1] 119
[1] 120
[1] 121
[1] 122
[1] 123
[1] 124
[1] 125
[1] 126
[1] 127
[1] 128
[1] 129
[1] 130
[1] 131
[1] 132
[1] 133
[1] 134
[1] 135
[1] 136
[1] 137
[1] 138
[1] 139
[1] 140
[1] 141
[1] 142
[1] 143
[1] 144
[1] 145
[1] 146
[1] 147
[1] 148
[1] 149
[1] 150
[1] 151
[1] 152
[1] 153
[1] 154
[1] 155
[1] 156
[1] 157
[1] 158
[1] 159
[1] 160
[1] 161
[1] 162
[1] 163
[1] 164
[1] 165
[1] 166
[1] 167
[1] 168
[1] 169
[1] 170
[1] 171
[1] 172
[1] 173
[1] 174
[1] 175
[1] 176
[1] 177
[1] 178
[1] 179
[1] 180
[1] 181
[1] 182
[1] 183
[1] 184
[1] 185
[1] 186
[1] 187
[1] 188
[1] 189
[1] 190
[1] 191
[1] 192
[1] 193
[1] 194
[1] 195
[1] 196
[1] 197
[1] 198
[1] 199
[1] 200
[1] 201
[1] 202
[1] 203
[1] 204
[1] 205
[1] 206
[1] 207
[1] 208
[1] 209
[1] 210
[1] 211
[1] 212
[1] 213
[1] 214
[1] 215
[1] 216
[1] 217
[1] 218
[1] 219
[1] 220
[1] 221
[1] 222
[1] 223
[1] 224
[1] 225
[1] 226
[1] 227
[1] 228
[1] 229
[1] 230
[1] 231
[1] 232
[1] 233
[1] 234
[1] 235
[1] 236
[1] 237
[1] 238
[1] 239
[1] 240
[1] 241
[1] 242
[1] 243
[1] 244
[1] 245
[1] 246
[1] 247
[1] 248
[1] 249
[1] 250
[1] 251
[1] 252
[1] 253
[1] 254
[1] 255
[1] 256
[1] 257
[1] 258
[1] 259
[1] 260
[1] 261
[1] 262
[1] 263
[1] 264
[1] 265
[1] 266
[1] 267
[1] 268
[1] 269
[1] 270
[1] 271
[1] 272
[1] 273
[1] 274
[1] 275
[1] 276
[1] 277
[1] 278
[1] 279
[1] 280
[1] 281
[1] 282
[1] 283
[1] 284
[1] 285
[1] 286
[1] 287
[1] 288
[1] 289
[1] 290
[1] 291
[1] 292
[1] 293
[1] 294
[1] 295
[1] 296
[1] 297
[1] 298
[1] 299
[1] 300
[1] 301
[1] 302
[1] 303
[1] 304
[1] 305
[1] 306
[1] 307
[1] 308
[1] 309
[1] 310
[1] 311
[1] 312
[1] 313
[1] 314
[1] 315
[1] 316
[1] 317
[1] 318
[1] 319
[1] 320
[1] 321
[1] 322
[1] 323
[1] 324
[1] 325
[1] 326
[1] 327
[1] 328
[1] 329
[1] 330
[1] 331
[1] 332
[1] 333
[1] 334
[1] 335
[1] 336
[1] 337
[1] 338
[1] 339
[1] 340
[1] 341
[1] 342
[1] 343
[1] 344
[1] 345
[1] 346
[1] 347
[1] 348
[1] 349
[1] 350
[1] 351
[1] 352
[1] 353
[1] 354
[1] 355
[1] 356
[1] 357
[1] 358
[1] 359
[1] 360
[1] 361
[1] 362
[1] 363
[1] 364
[1] 365
[1] 366
[1] 367
[1] 368
[1] 369
[1] 370
[1] 371
[1] 372
[1] 373
[1] 374
[1] 375
[1] 376
[1] 377
[1] 378
[1] 379
[1] 380
[1] 381
[1] 382
[1] 383
[1] 384
[1] 385
[1] 386
[1] 387
[1] 388
[1] 389
[1] 390
[1] 391
[1] 392
[1] 393
[1] 394
[1] 395
[1] 396
[1] 397
[1] 398
[1] 399
[1] 400
[1] 401
[1] 402
[1] 403
[1] 404
[1] 405
[1] 406
[1] 407
[1] 408
[1] 409
[1] 410
[1] 411
[1] 412
[1] 413
[1] 414
[1] 415
[1] 416
[1] 417
[1] 418
[1] 419
[1] 420
[1] 421
[1] 422
[1] 423
[1] 424
[1] 425
[1] 426
[1] 427
[1] 428
[1] 429
[1] 430
[1] 431
[1] 432
[1] 433
[1] 434
[1] 435
[1] 436
[1] 437
[1] 438
[1] 439
[1] 440
[1] 441
[1] 442
[1] 443
[1] 444
[1] 445
[1] 446
[1] 447
[1] 448
[1] 449
[1] 450
[1] 451
[1] 452
[1] 453
[1] 454
[1] 455
[1] 456
[1] 457
[1] 458
[1] 459
[1] 460
[1] 461
[1] 462
[1] 463
[1] 464
[1] 465
[1] 466
[1] 467
[1] 468
[1] 469
[1] 470
[1] 471
[1] 472
[1] 473
[1] 474
[1] 475
[1] 476
[1] 477
[1] 478
[1] 479
[1] 480
[1] 481
[1] 482
[1] 483
[1] 484
[1] 485
[1] 486
[1] 487
[1] 488
[1] 489
[1] 490
[1] 491
[1] 492
[1] 493
[1] 494
[1] 495
[1] 496
[1] 497
[1] 498
[1] 499
[1] 500
[1] 501
[1] 502
[1] 503
[1] 504
[1] 505
[1] 506
[1] 507
[1] 508
[1] 509
[1] 510
[1] 511
[1] 512
[1] 513
[1] 514
[1] 515
[1] 516
[1] 517
[1] 518
[1] 519
[1] 520
[1] 521
[1] 522
[1] 523
[1] 524
[1] 525
[1] 526
[1] 527
[1] 528
[1] 529
[1] 530
[1] 531
[1] 532
[1] 533
[1] 534
[1] 535
[1] 536
[1] 537
[1] 538
[1] 539
[1] 540
[1] 541
[1] 542
[1] 543
[1] 544
[1] 545
[1] 546
[1] 547
[1] 548
[1] 549
[1] 550
[1] 551
[1] 552
[1] 553
[1] 554
[1] 555
[1] 556
[1] 557
[1] 558
[1] 559
[1] 560
[1] 561
[1] 562
[1] 563
[1] 564
[1] 565
[1] 566
[1] 567
[1] 568
[1] 569
[1] 570
[1] 571
[1] 572
[1] 573
[1] 574
[1] 575
[1] 576
[1] 577
[1] 578
[1] 579
[1] 580
[1] 581
[1] 582
[1] 583
[1] 584
[1] 585
[1] 586
[1] 587
[1] 588
[1] 589
[1] 590
[1] 591
[1] 592
[1] 593
[1] 594
[1] 595
[1] 596
[1] 597
[1] 598
[1] 599
[1] 600
[1] 601
[1] 602
[1] 603
[1] 604
[1] 605
[1] 606
[1] 607
[1] 608
[1] 609
[1] 610
[1] 611
[1] 612
[1] 613
[1] 614
[1] 615
[1] 616
[1] 617
[1] 618
[1] 619
[1] 620
[1] 621
[1] 622
[1] 623
[1] 624
[1] 625
[1] 626
[1] 627
[1] 628
[1] 629
[1] 630
[1] 631
[1] 632
[1] 633
[1] 634
[1] 635
[1] 636
[1] 637
[1] 638
[1] 639
[1] 640
[1] 641
[1] 642
[1] 643
[1] 644
[1] 645
[1] 646
[1] 647
[1] 648
[1] 649
[1] 650
[1] 651
[1] 652
[1] 653
[1] 654
[1] 655
[1] 656
[1] 657
[1] 658
[1] 659
[1] 660
[1] 661
[1] 662
[1] 663
[1] 664
[1] 665
[1] 666
[1] 667
[1] 668
[1] 669
[1] 670
[1] 671
[1] 672
[1] 673
[1] 674
[1] 675
[1] 676
[1] 677
[1] 678
[1] 679
[1] 680
[1] 681
[1] 682
[1] 683
[1] 684
[1] 685
[1] 686
[1] 687
[1] 688
[1] 689
[1] 690
[1] 691
[1] 692
[1] 693
[1] 694
[1] 695
[1] 696
[1] 697
[1] 698
[1] 699
[1] 700
[1] 701
[1] 702
[1] 703
[1] 704
[1] 705
[1] 706
[1] 707
[1] 708
[1] 709
[1] 710
[1] 711
[1] 712
[1] 713
[1] 714
[1] 715
[1] 716
[1] 717
[1] 718
[1] 719
[1] 720
[1] 721
[1] 722
[1] 723
[1] 724
[1] 725
[1] 726
[1] 727
[1] 728
[1] 729
[1] 730
[1] 731
[1] 732
[1] 733
[1] 734
[1] 735
[1] 736
[1] 737
[1] 738
[1] 739
[1] 740
[1] 741
[1] 742
[1] 743
[1] 744
[1] 745
[1] 746
[1] 747
[1] 748
[1] 749
[1] 750
[1] 751
[1] 752
[1] 753
[1] 754
[1] 755
[1] 756
[1] 757
[1] 758
[1] 759
[1] 760
[1] 761
[1] 762
[1] 763
[1] 764
[1] 765
[1] 766
[1] 767
[1] 768
[1] 769
[1] 770
[1] 771
[1] 772
[1] 773
[1] 774
[1] 775
[1] 776
[1] 777
[1] 778
[1] 779
[1] 780
[1] 781
[1] 782
[1] 783
[1] 784
[1] 785
[1] 786
[1] 787
[1] 788
[1] 789
[1] 790
[1] 791
[1] 792
[1] 793
[1] 794
[1] 795
[1] 796
[1] 797
[1] 798
[1] 799
[1] 800
[1] 801
[1] 802
[1] 803
[1] 804
[1] 805
[1] 806
[1] 807
[1] 808
[1] 809
[1] 810
[1] 811
[1] 812
[1] 813
[1] 814
[1] 815
[1] 816
[1] 817
[1] 818
[1] 819
[1] 820
[1] 821
[1] 822
[1] 823
[1] 824
[1] 825
[1] 826
[1] 827
[1] 828
[1] 829
[1] 830
[1] 831
[1] 832
[1] 833
[1] 834
[1] 835
[1] 836
[1] 837
[1] 838
[1] 839
[1] 840
[1] 841
[1] 842
[1] 843
[1] 844
[1] 845
[1] 846
[1] 847
[1] 848
[1] 849
[1] 850
[1] 851
[1] 852
[1] 853
[1] 854
[1] 855
[1] 856
[1] 857
[1] 858
[1] 859
[1] 860
[1] 861
[1] 862
[1] 863
[1] 864
[1] 865
[1] 866
[1] 867
[1] 868
[1] 869
[1] 870
[1] 871
[1] 872
[1] 873
[1] 874
[1] 875
[1] 876
[1] 877
[1] 878
[1] 879
[1] 880
[1] 881
[1] 882
[1] 883
[1] 884
[1] 885
[1] 886
[1] 887
[1] 888
[1] 889
[1] 890
[1] 891
[1] 892
[1] 893
[1] 894
[1] 895
[1] 896
[1] 897
[1] 898
[1] 899
[1] 900
[1] 901
[1] 902
[1] 903
[1] 904
[1] 905
[1] 906
[1] 907
[1] 908
[1] 909
[1] 910
[1] 911
[1] 912
[1] 913
[1] 914
[1] 915
[1] 916
[1] 917
[1] 918
[1] 919
[1] 920
[1] 921
[1] 922
[1] 923
[1] 924
[1] 925
[1] 926
[1] 927
[1] 928
[1] 929
[1] 930
[1] 931
[1] 932
[1] 933
[1] 934
[1] 935
[1] 936
[1] 937
[1] 938
[1] 939
[1] 940
[1] 941
[1] 942
[1] 943
[1] 944
[1] 945
[1] 946
[1] 947
[1] 948
[1] 949
[1] 950
[1] 951
[1] 952
[1] 953
[1] 954
[1] 955
[1] 956
[1] 957
[1] 958
[1] 959
[1] 960
[1] 961
[1] 962
[1] 963
[1] 964
[1] 965
[1] 966
[1] 967
[1] 968
[1] 969
[1] 970
[1] 971
[1] 972
[1] 973
[1] 974
[1] 975
[1] 976
[1] 977
[1] 978
[1] 979
[1] 980
[1] 981
[1] 982
[1] 983
[1] 984
[1] 985
[1] 986
[1] 987
[1] 988
[1] 989
[1] 990
[1] 991
[1] 992
[1] 993
[1] 994
[1] 995
[1] 996
[1] 997
[1] 998
[1] 999
[1] 1000
  
#reduce to mean and standard deviation
predicted_dissim_trends_rnormruns_constanttemp[,mean_dissim_coef:= mean(estimate),survey_unit][,sd_dissim := sd(estimate),.(survey_unit)]

predicted_dissim_trends_rnormrunsconstant_temp.summary <- unique(predicted_dissim_trends_rnormruns_constanttemp[,.(survey_unit, mean_dissim_coef, sd_dissim)])

predicted_dissim_trends_rnormrunsconstant_temp.summary[,pred_type := "temp_constant"]

predicted_dissim_trends_rnormruns.summary <- rbind(predicted_dissim_trends_rnormruns.summary, predicted_dissim_trends_rnormrunsconstant_temp.summary)

################################################################################
#predictions with fishing held constant (and temperature varying)
################################################################################
#table with predicted dissimilarity values and standard error of all predicted dissimilarity values (by year)
table_constantfishing <- dissimilarity_covariates_dredge.dt_predictions_consistentfishinginreg[,.(survey_unit, pred_dissim, pred_se, year)]
#0) make datatable to populate
  predicted_dissim_trends_rnormruns_constantfishing <- data.table()
#1) NEW PREDICTED VALUES FROM DISTRIBUTION
for (i in 1:1000){
  table_constantfishing[,rnorm_pred := rnorm(1, mean = pred_dissim, sd = pred_se),.(year, survey_unit)]
#2) CALCULATE LINEAR MODEL FOR SLOPE VALUES
  jaccard_total_predicted_lm_singlerun_constantfishing <- lm(rnorm_pred ~ year*survey_unit,data = table_constantfishing)

  model_coefs_reduced_predictions_singlerun_constantfishing <- data.table(summary(jaccard_total_predicted_lm_singlerun_constantfishing)$coefficients)
  model_coefs_reduced_predictions_singlerun_constantfishing[,var := rownames(summary(jaccard_total_predicted_lm_singlerun_constantfishing)$coefficients)]
  
  #limit to interactions only (check this if there are any model changes!) row 2 and rows 34:64
  model_coefs_reduced_predictions_singlerun_constantfishing <- model_coefs_reduced_predictions_singlerun_constantfishing[c(2,34:64),]
  
  #adjust survey unit name by deleting beginning of string
  model_coefs_reduced_predictions_singlerun_constantfishing[,survey_unit := substr(var, 17, str_length(var))][var == "year",survey_unit := "AI"]
  
  #calculate interaction coefficients
  AI_estimate <- model_coefs_reduced_predictions_singlerun_constantfishing[1,Estimate]
  model_coefs_reduced_predictions_singlerun_constantfishing[1,estimate := AI_estimate]
  model_coefs_reduced_predictions_singlerun_constantfishing[2:32,estimate := (AI_estimate + Estimate)]
  
  predicted_dissim_trends_rnormruns_constantfishing <- rbind(predicted_dissim_trends_rnormruns_constantfishing, model_coefs_reduced_predictions_singlerun_constantfishing[,.(survey_unit, estimate)])
  
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15
[1] 16
[1] 17
[1] 18
[1] 19
[1] 20
[1] 21
[1] 22
[1] 23
[1] 24
[1] 25
[1] 26
[1] 27
[1] 28
[1] 29
[1] 30
[1] 31
[1] 32
[1] 33
[1] 34
[1] 35
[1] 36
[1] 37
[1] 38
[1] 39
[1] 40
[1] 41
[1] 42
[1] 43
[1] 44
[1] 45
[1] 46
[1] 47
[1] 48
[1] 49
[1] 50
[1] 51
[1] 52
[1] 53
[1] 54
[1] 55
[1] 56
[1] 57
[1] 58
[1] 59
[1] 60
[1] 61
[1] 62
[1] 63
[1] 64
[1] 65
[1] 66
[1] 67
[1] 68
[1] 69
[1] 70
[1] 71
[1] 72
[1] 73
[1] 74
[1] 75
[1] 76
[1] 77
[1] 78
[1] 79
[1] 80
[1] 81
[1] 82
[1] 83
[1] 84
[1] 85
[1] 86
[1] 87
[1] 88
[1] 89
[1] 90
[1] 91
[1] 92
[1] 93
[1] 94
[1] 95
[1] 96
[1] 97
[1] 98
[1] 99
[1] 100
[1] 101
[1] 102
[1] 103
[1] 104
[1] 105
[1] 106
[1] 107
[1] 108
[1] 109
[1] 110
[1] 111
[1] 112
[1] 113
[1] 114
[1] 115
[1] 116
[1] 117
[1] 118
[1] 119
[1] 120
[1] 121
[1] 122
[1] 123
[1] 124
[1] 125
[1] 126
[1] 127
[1] 128
[1] 129
[1] 130
[1] 131
[1] 132
[1] 133
[1] 134
[1] 135
[1] 136
[1] 137
[1] 138
[1] 139
[1] 140
[1] 141
[1] 142
[1] 143
[1] 144
[1] 145
[1] 146
[1] 147
[1] 148
[1] 149
[1] 150
[1] 151
[1] 152
[1] 153
[1] 154
[1] 155
[1] 156
[1] 157
[1] 158
[1] 159
[1] 160
[1] 161
[1] 162
[1] 163
[1] 164
[1] 165
[1] 166
[1] 167
[1] 168
[1] 169
[1] 170
[1] 171
[1] 172
[1] 173
[1] 174
[1] 175
[1] 176
[1] 177
[1] 178
[1] 179
[1] 180
[1] 181
[1] 182
[1] 183
[1] 184
[1] 185
[1] 186
[1] 187
[1] 188
[1] 189
[1] 190
[1] 191
[1] 192
[1] 193
[1] 194
[1] 195
[1] 196
[1] 197
[1] 198
[1] 199
[1] 200
[1] 201
[1] 202
[1] 203
[1] 204
[1] 205
[1] 206
[1] 207
[1] 208
[1] 209
[1] 210
[1] 211
[1] 212
[1] 213
[1] 214
[1] 215
[1] 216
[1] 217
[1] 218
[1] 219
[1] 220
[1] 221
[1] 222
[1] 223
[1] 224
[1] 225
[1] 226
[1] 227
[1] 228
[1] 229
[1] 230
[1] 231
[1] 232
[1] 233
[1] 234
[1] 235
[1] 236
[1] 237
[1] 238
[1] 239
[1] 240
[1] 241
[1] 242
[1] 243
[1] 244
[1] 245
[1] 246
[1] 247
[1] 248
[1] 249
[1] 250
[1] 251
[1] 252
[1] 253
[1] 254
[1] 255
[1] 256
[1] 257
[1] 258
[1] 259
[1] 260
[1] 261
[1] 262
[1] 263
[1] 264
[1] 265
[1] 266
[1] 267
[1] 268
[1] 269
[1] 270
[1] 271
[1] 272
[1] 273
[1] 274
[1] 275
[1] 276
[1] 277
[1] 278
[1] 279
[1] 280
[1] 281
[1] 282
[1] 283
[1] 284
[1] 285
[1] 286
[1] 287
[1] 288
[1] 289
[1] 290
[1] 291
[1] 292
[1] 293
[1] 294
[1] 295
[1] 296
[1] 297
[1] 298
[1] 299
[1] 300
[1] 301
[1] 302
[1] 303
[1] 304
[1] 305
[1] 306
[1] 307
[1] 308
[1] 309
[1] 310
[1] 311
[1] 312
[1] 313
[1] 314
[1] 315
[1] 316
[1] 317
[1] 318
[1] 319
[1] 320
[1] 321
[1] 322
[1] 323
[1] 324
[1] 325
[1] 326
[1] 327
[1] 328
[1] 329
[1] 330
[1] 331
[1] 332
[1] 333
[1] 334
[1] 335
[1] 336
[1] 337
[1] 338
[1] 339
[1] 340
[1] 341
[1] 342
[1] 343
[1] 344
[1] 345
[1] 346
[1] 347
[1] 348
[1] 349
[1] 350
[1] 351
[1] 352
[1] 353
[1] 354
[1] 355
[1] 356
[1] 357
[1] 358
[1] 359
[1] 360
[1] 361
[1] 362
[1] 363
[1] 364
[1] 365
[1] 366
[1] 367
[1] 368
[1] 369
[1] 370
[1] 371
[1] 372
[1] 373
[1] 374
[1] 375
[1] 376
[1] 377
[1] 378
[1] 379
[1] 380
[1] 381
[1] 382
[1] 383
[1] 384
[1] 385
[1] 386
[1] 387
[1] 388
[1] 389
[1] 390
[1] 391
[1] 392
[1] 393
[1] 394
[1] 395
[1] 396
[1] 397
[1] 398
[1] 399
[1] 400
[1] 401
[1] 402
[1] 403
[1] 404
[1] 405
[1] 406
[1] 407
[1] 408
[1] 409
[1] 410
[1] 411
[1] 412
[1] 413
[1] 414
[1] 415
[1] 416
[1] 417
[1] 418
[1] 419
[1] 420
[1] 421
[1] 422
[1] 423
[1] 424
[1] 425
[1] 426
[1] 427
[1] 428
[1] 429
[1] 430
[1] 431
[1] 432
[1] 433
[1] 434
[1] 435
[1] 436
[1] 437
[1] 438
[1] 439
[1] 440
[1] 441
[1] 442
[1] 443
[1] 444
[1] 445
[1] 446
[1] 447
[1] 448
[1] 449
[1] 450
[1] 451
[1] 452
[1] 453
[1] 454
[1] 455
[1] 456
[1] 457
[1] 458
[1] 459
[1] 460
[1] 461
[1] 462
[1] 463
[1] 464
[1] 465
[1] 466
[1] 467
[1] 468
[1] 469
[1] 470
[1] 471
[1] 472
[1] 473
[1] 474
[1] 475
[1] 476
[1] 477
[1] 478
[1] 479
[1] 480
[1] 481
[1] 482
[1] 483
[1] 484
[1] 485
[1] 486
[1] 487
[1] 488
[1] 489
[1] 490
[1] 491
[1] 492
[1] 493
[1] 494
[1] 495
[1] 496
[1] 497
[1] 498
[1] 499
[1] 500
[1] 501
[1] 502
[1] 503
[1] 504
[1] 505
[1] 506
[1] 507
[1] 508
[1] 509
[1] 510
[1] 511
[1] 512
[1] 513
[1] 514
[1] 515
[1] 516
[1] 517
[1] 518
[1] 519
[1] 520
[1] 521
[1] 522
[1] 523
[1] 524
[1] 525
[1] 526
[1] 527
[1] 528
[1] 529
[1] 530
[1] 531
[1] 532
[1] 533
[1] 534
[1] 535
[1] 536
[1] 537
[1] 538
[1] 539
[1] 540
[1] 541
[1] 542
[1] 543
[1] 544
[1] 545
[1] 546
[1] 547
[1] 548
[1] 549
[1] 550
[1] 551
[1] 552
[1] 553
[1] 554
[1] 555
[1] 556
[1] 557
[1] 558
[1] 559
[1] 560
[1] 561
[1] 562
[1] 563
[1] 564
[1] 565
[1] 566
[1] 567
[1] 568
[1] 569
[1] 570
[1] 571
[1] 572
[1] 573
[1] 574
[1] 575
[1] 576
[1] 577
[1] 578
[1] 579
[1] 580
[1] 581
[1] 582
[1] 583
[1] 584
[1] 585
[1] 586
[1] 587
[1] 588
[1] 589
[1] 590
[1] 591
[1] 592
[1] 593
[1] 594
[1] 595
[1] 596
[1] 597
[1] 598
[1] 599
[1] 600
[1] 601
[1] 602
[1] 603
[1] 604
[1] 605
[1] 606
[1] 607
[1] 608
[1] 609
[1] 610
[1] 611
[1] 612
[1] 613
[1] 614
[1] 615
[1] 616
[1] 617
[1] 618
[1] 619
[1] 620
[1] 621
[1] 622
[1] 623
[1] 624
[1] 625
[1] 626
[1] 627
[1] 628
[1] 629
[1] 630
[1] 631
[1] 632
[1] 633
[1] 634
[1] 635
[1] 636
[1] 637
[1] 638
[1] 639
[1] 640
[1] 641
[1] 642
[1] 643
[1] 644
[1] 645
[1] 646
[1] 647
[1] 648
[1] 649
[1] 650
[1] 651
[1] 652
[1] 653
[1] 654
[1] 655
[1] 656
[1] 657
[1] 658
[1] 659
[1] 660
[1] 661
[1] 662
[1] 663
[1] 664
[1] 665
[1] 666
[1] 667
[1] 668
[1] 669
[1] 670
[1] 671
[1] 672
[1] 673
[1] 674
[1] 675
[1] 676
[1] 677
[1] 678
[1] 679
[1] 680
[1] 681
[1] 682
[1] 683
[1] 684
[1] 685
[1] 686
[1] 687
[1] 688
[1] 689
[1] 690
[1] 691
[1] 692
[1] 693
[1] 694
[1] 695
[1] 696
[1] 697
[1] 698
[1] 699
[1] 700
[1] 701
[1] 702
[1] 703
[1] 704
[1] 705
[1] 706
[1] 707
[1] 708
[1] 709
[1] 710
[1] 711
[1] 712
[1] 713
[1] 714
[1] 715
[1] 716
[1] 717
[1] 718
[1] 719
[1] 720
[1] 721
[1] 722
[1] 723
[1] 724
[1] 725
[1] 726
[1] 727
[1] 728
[1] 729
[1] 730
[1] 731
[1] 732
[1] 733
[1] 734
[1] 735
[1] 736
[1] 737
[1] 738
[1] 739
[1] 740
[1] 741
[1] 742
[1] 743
[1] 744
[1] 745
[1] 746
[1] 747
[1] 748
[1] 749
[1] 750
[1] 751
[1] 752
[1] 753
[1] 754
[1] 755
[1] 756
[1] 757
[1] 758
[1] 759
[1] 760
[1] 761
[1] 762
[1] 763
[1] 764
[1] 765
[1] 766
[1] 767
[1] 768
[1] 769
[1] 770
[1] 771
[1] 772
[1] 773
[1] 774
[1] 775
[1] 776
[1] 777
[1] 778
[1] 779
[1] 780
[1] 781
[1] 782
[1] 783
[1] 784
[1] 785
[1] 786
[1] 787
[1] 788
[1] 789
[1] 790
[1] 791
[1] 792
[1] 793
[1] 794
[1] 795
[1] 796
[1] 797
[1] 798
[1] 799
[1] 800
[1] 801
[1] 802
[1] 803
[1] 804
[1] 805
[1] 806
[1] 807
[1] 808
[1] 809
[1] 810
[1] 811
[1] 812
[1] 813
[1] 814
[1] 815
[1] 816
[1] 817
[1] 818
[1] 819
[1] 820
[1] 821
[1] 822
[1] 823
[1] 824
[1] 825
[1] 826
[1] 827
[1] 828
[1] 829
[1] 830
[1] 831
[1] 832
[1] 833
[1] 834
[1] 835
[1] 836
[1] 837
[1] 838
[1] 839
[1] 840
[1] 841
[1] 842
[1] 843
[1] 844
[1] 845
[1] 846
[1] 847
[1] 848
[1] 849
[1] 850
[1] 851
[1] 852
[1] 853
[1] 854
[1] 855
[1] 856
[1] 857
[1] 858
[1] 859
[1] 860
[1] 861
[1] 862
[1] 863
[1] 864
[1] 865
[1] 866
[1] 867
[1] 868
[1] 869
[1] 870
[1] 871
[1] 872
[1] 873
[1] 874
[1] 875
[1] 876
[1] 877
[1] 878
[1] 879
[1] 880
[1] 881
[1] 882
[1] 883
[1] 884
[1] 885
[1] 886
[1] 887
[1] 888
[1] 889
[1] 890
[1] 891
[1] 892
[1] 893
[1] 894
[1] 895
[1] 896
[1] 897
[1] 898
[1] 899
[1] 900
[1] 901
[1] 902
[1] 903
[1] 904
[1] 905
[1] 906
[1] 907
[1] 908
[1] 909
[1] 910
[1] 911
[1] 912
[1] 913
[1] 914
[1] 915
[1] 916
[1] 917
[1] 918
[1] 919
[1] 920
[1] 921
[1] 922
[1] 923
[1] 924
[1] 925
[1] 926
[1] 927
[1] 928
[1] 929
[1] 930
[1] 931
[1] 932
[1] 933
[1] 934
[1] 935
[1] 936
[1] 937
[1] 938
[1] 939
[1] 940
[1] 941
[1] 942
[1] 943
[1] 944
[1] 945
[1] 946
[1] 947
[1] 948
[1] 949
[1] 950
[1] 951
[1] 952
[1] 953
[1] 954
[1] 955
[1] 956
[1] 957
[1] 958
[1] 959
[1] 960
[1] 961
[1] 962
[1] 963
[1] 964
[1] 965
[1] 966
[1] 967
[1] 968
[1] 969
[1] 970
[1] 971
[1] 972
[1] 973
[1] 974
[1] 975
[1] 976
[1] 977
[1] 978
[1] 979
[1] 980
[1] 981
[1] 982
[1] 983
[1] 984
[1] 985
[1] 986
[1] 987
[1] 988
[1] 989
[1] 990
[1] 991
[1] 992
[1] 993
[1] 994
[1] 995
[1] 996
[1] 997
[1] 998
[1] 999
[1] 1000
  
#reduce to mean and standard deviation
predicted_dissim_trends_rnormruns_constantfishing[,mean_dissim_coef:= mean(estimate),survey_unit][,sd_dissim := sd(estimate),.(survey_unit)]

predicted_dissim_trends_rnormrunsconstant_fishing.summary <- unique(predicted_dissim_trends_rnormruns_constantfishing[,.(survey_unit, mean_dissim_coef, sd_dissim)])

predicted_dissim_trends_rnormrunsconstant_fishing.summary[,pred_type := "fishing_constant"]

predicted_dissim_trends_rnormruns.summary <- rbind(predicted_dissim_trends_rnormruns.summary, predicted_dissim_trends_rnormrunsconstant_fishing.summary)


################################################################################
#predictions with both fishing and temperature held constant (variability goes to other factors we don't account for)
################################################################################
#table with predicted dissimilarity values and standard error of all predicted dissimilarity values (by year)
table_constanttempfishing <- dissimilarity_covariates_dredge.dt_predictions_consistenttempfishinginreg[,.(survey_unit, pred_dissim, pred_se, year)]
#0) make datatable to populate
  predicted_dissim_trends_rnormruns_constanttempfishing <- data.table()
#1) NEW PREDICTED VALUES FROM DISTRIBUTION
for (i in 1:1000){
  table_constanttempfishing[,rnorm_pred := rnorm(1, mean = pred_dissim, sd = pred_se),.(year, survey_unit)]
#2) CALCULATE LINEAR MODEL FOR SLOPE VALUES
  jaccard_total_predicted_lm_singlerun_constanttempfishing <- lm(rnorm_pred ~ year*survey_unit,data = table_constanttempfishing)

  model_coefs_reduced_predictions_singlerun_constanttempfishing <- data.table(summary(jaccard_total_predicted_lm_singlerun_constanttempfishing)$coefficients)
  model_coefs_reduced_predictions_singlerun_constanttempfishing[,var := rownames(summary(jaccard_total_predicted_lm_singlerun_constanttempfishing)$coefficients)]
  
  #limit to interactions only (check this if there are any model changes!) row 2 and rows 34:64
  model_coefs_reduced_predictions_singlerun_constanttempfishing <- model_coefs_reduced_predictions_singlerun_constanttempfishing[c(2,34:64),]
  
  #adjust survey unit name by deleting beginning of string
  model_coefs_reduced_predictions_singlerun_constanttempfishing[,survey_unit := substr(var, 17, str_length(var))][var == "year",survey_unit := "AI"]
  
  #calculate interaction coefficients
  AI_estimate <- model_coefs_reduced_predictions_singlerun_constanttempfishing[1,Estimate]
  model_coefs_reduced_predictions_singlerun_constanttempfishing[1,estimate := AI_estimate]
  model_coefs_reduced_predictions_singlerun_constanttempfishing[2:32,estimate := (AI_estimate + Estimate)]
  
  predicted_dissim_trends_rnormruns_constanttempfishing <- rbind(predicted_dissim_trends_rnormruns_constanttempfishing, model_coefs_reduced_predictions_singlerun_constanttempfishing[,.(survey_unit, estimate)])
  
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15
[1] 16
[1] 17
[1] 18
[1] 19
[1] 20
[1] 21
[1] 22
[1] 23
[1] 24
[1] 25
[1] 26
[1] 27
[1] 28
[1] 29
[1] 30
[1] 31
[1] 32
[1] 33
[1] 34
[1] 35
[1] 36
[1] 37
[1] 38
[1] 39
[1] 40
[1] 41
[1] 42
[1] 43
[1] 44
[1] 45
[1] 46
[1] 47
[1] 48
[1] 49
[1] 50
[1] 51
[1] 52
[1] 53
[1] 54
[1] 55
[1] 56
[1] 57
[1] 58
[1] 59
[1] 60
[1] 61
[1] 62
[1] 63
[1] 64
[1] 65
[1] 66
[1] 67
[1] 68
[1] 69
[1] 70
[1] 71
[1] 72
[1] 73
[1] 74
[1] 75
[1] 76
[1] 77
[1] 78
[1] 79
[1] 80
[1] 81
[1] 82
[1] 83
[1] 84
[1] 85
[1] 86
[1] 87
[1] 88
[1] 89
[1] 90
[1] 91
[1] 92
[1] 93
[1] 94
[1] 95
[1] 96
[1] 97
[1] 98
[1] 99
[1] 100
[1] 101
[1] 102
[1] 103
[1] 104
[1] 105
[1] 106
[1] 107
[1] 108
[1] 109
[1] 110
[1] 111
[1] 112
[1] 113
[1] 114
[1] 115
[1] 116
[1] 117
[1] 118
[1] 119
[1] 120
[1] 121
[1] 122
[1] 123
[1] 124
[1] 125
[1] 126
[1] 127
[1] 128
[1] 129
[1] 130
[1] 131
[1] 132
[1] 133
[1] 134
[1] 135
[1] 136
[1] 137
[1] 138
[1] 139
[1] 140
[1] 141
[1] 142
[1] 143
[1] 144
[1] 145
[1] 146
[1] 147
[1] 148
[1] 149
[1] 150
[1] 151
[1] 152
[1] 153
[1] 154
[1] 155
[1] 156
[1] 157
[1] 158
[1] 159
[1] 160
[1] 161
[1] 162
[1] 163
[1] 164
[1] 165
[1] 166
[1] 167
[1] 168
[1] 169
[1] 170
[1] 171
[1] 172
[1] 173
[1] 174
[1] 175
[1] 176
[1] 177
[1] 178
[1] 179
[1] 180
[1] 181
[1] 182
[1] 183
[1] 184
[1] 185
[1] 186
[1] 187
[1] 188
[1] 189
[1] 190
[1] 191
[1] 192
[1] 193
[1] 194
[1] 195
[1] 196
[1] 197
[1] 198
[1] 199
[1] 200
[1] 201
[1] 202
[1] 203
[1] 204
[1] 205
[1] 206
[1] 207
[1] 208
[1] 209
[1] 210
[1] 211
[1] 212
[1] 213
[1] 214
[1] 215
[1] 216
[1] 217
[1] 218
[1] 219
[1] 220
[1] 221
[1] 222
[1] 223
[1] 224
[1] 225
[1] 226
[1] 227
[1] 228
[1] 229
[1] 230
[1] 231
[1] 232
[1] 233
[1] 234
[1] 235
[1] 236
[1] 237
[1] 238
[1] 239
[1] 240
[1] 241
[1] 242
[1] 243
[1] 244
[1] 245
[1] 246
[1] 247
[1] 248
[1] 249
[1] 250
[1] 251
[1] 252
[1] 253
[1] 254
[1] 255
[1] 256
[1] 257
[1] 258
[1] 259
[1] 260
[1] 261
[1] 262
[1] 263
[1] 264
[1] 265
[1] 266
[1] 267
[1] 268
[1] 269
[1] 270
[1] 271
[1] 272
[1] 273
[1] 274
[1] 275
[1] 276
[1] 277
[1] 278
[1] 279
[1] 280
[1] 281
[1] 282
[1] 283
[1] 284
[1] 285
[1] 286
[1] 287
[1] 288
[1] 289
[1] 290
[1] 291
[1] 292
[1] 293
[1] 294
[1] 295
[1] 296
[1] 297
[1] 298
[1] 299
[1] 300
[1] 301
[1] 302
[1] 303
[1] 304
[1] 305
[1] 306
[1] 307
[1] 308
[1] 309
[1] 310
[1] 311
[1] 312
[1] 313
[1] 314
[1] 315
[1] 316
[1] 317
[1] 318
[1] 319
[1] 320
[1] 321
[1] 322
[1] 323
[1] 324
[1] 325
[1] 326
[1] 327
[1] 328
[1] 329
[1] 330
[1] 331
[1] 332
[1] 333
[1] 334
[1] 335
[1] 336
[1] 337
[1] 338
[1] 339
[1] 340
[1] 341
[1] 342
[1] 343
[1] 344
[1] 345
[1] 346
[1] 347
[1] 348
[1] 349
[1] 350
[1] 351
[1] 352
[1] 353
[1] 354
[1] 355
[1] 356
[1] 357
[1] 358
[1] 359
[1] 360
[1] 361
[1] 362
[1] 363
[1] 364
[1] 365
[1] 366
[1] 367
[1] 368
[1] 369
[1] 370
[1] 371
[1] 372
[1] 373
[1] 374
[1] 375
[1] 376
[1] 377
[1] 378
[1] 379
[1] 380
[1] 381
[1] 382
[1] 383
[1] 384
[1] 385
[1] 386
[1] 387
[1] 388
[1] 389
[1] 390
[1] 391
[1] 392
[1] 393
[1] 394
[1] 395
[1] 396
[1] 397
[1] 398
[1] 399
[1] 400
[1] 401
[1] 402
[1] 403
[1] 404
[1] 405
[1] 406
[1] 407
[1] 408
[1] 409
[1] 410
[1] 411
[1] 412
[1] 413
[1] 414
[1] 415
[1] 416
[1] 417
[1] 418
[1] 419
[1] 420
[1] 421
[1] 422
[1] 423
[1] 424
[1] 425
[1] 426
[1] 427
[1] 428
[1] 429
[1] 430
[1] 431
[1] 432
[1] 433
[1] 434
[1] 435
[1] 436
[1] 437
[1] 438
[1] 439
[1] 440
[1] 441
[1] 442
[1] 443
[1] 444
[1] 445
[1] 446
[1] 447
[1] 448
[1] 449
[1] 450
[1] 451
[1] 452
[1] 453
[1] 454
[1] 455
[1] 456
[1] 457
[1] 458
[1] 459
[1] 460
[1] 461
[1] 462
[1] 463
[1] 464
[1] 465
[1] 466
[1] 467
[1] 468
[1] 469
[1] 470
[1] 471
[1] 472
[1] 473
[1] 474
[1] 475
[1] 476
[1] 477
[1] 478
[1] 479
[1] 480
[1] 481
[1] 482
[1] 483
[1] 484
[1] 485
[1] 486
[1] 487
[1] 488
[1] 489
[1] 490
[1] 491
[1] 492
[1] 493
[1] 494
[1] 495
[1] 496
[1] 497
[1] 498
[1] 499
[1] 500
[1] 501
[1] 502
[1] 503
[1] 504
[1] 505
[1] 506
[1] 507
[1] 508
[1] 509
[1] 510
[1] 511
[1] 512
[1] 513
[1] 514
[1] 515
[1] 516
[1] 517
[1] 518
[1] 519
[1] 520
[1] 521
[1] 522
[1] 523
[1] 524
[1] 525
[1] 526
[1] 527
[1] 528
[1] 529
[1] 530
[1] 531
[1] 532
[1] 533
[1] 534
[1] 535
[1] 536
[1] 537
[1] 538
[1] 539
[1] 540
[1] 541
[1] 542
[1] 543
[1] 544
[1] 545
[1] 546
[1] 547
[1] 548
[1] 549
[1] 550
[1] 551
[1] 552
[1] 553
[1] 554
[1] 555
[1] 556
[1] 557
[1] 558
[1] 559
[1] 560
[1] 561
[1] 562
[1] 563
[1] 564
[1] 565
[1] 566
[1] 567
[1] 568
[1] 569
[1] 570
[1] 571
[1] 572
[1] 573
[1] 574
[1] 575
[1] 576
[1] 577
[1] 578
[1] 579
[1] 580
[1] 581
[1] 582
[1] 583
[1] 584
[1] 585
[1] 586
[1] 587
[1] 588
[1] 589
[1] 590
[1] 591
[1] 592
[1] 593
[1] 594
[1] 595
[1] 596
[1] 597
[1] 598
[1] 599
[1] 600
[1] 601
[1] 602
[1] 603
[1] 604
[1] 605
[1] 606
[1] 607
[1] 608
[1] 609
[1] 610
[1] 611
[1] 612
[1] 613
[1] 614
[1] 615
[1] 616
[1] 617
[1] 618
[1] 619
[1] 620
[1] 621
[1] 622
[1] 623
[1] 624
[1] 625
[1] 626
[1] 627
[1] 628
[1] 629
[1] 630
[1] 631
[1] 632
[1] 633
[1] 634
[1] 635
[1] 636
[1] 637
[1] 638
[1] 639
[1] 640
[1] 641
[1] 642
[1] 643
[1] 644
[1] 645
[1] 646
[1] 647
[1] 648
[1] 649
[1] 650
[1] 651
[1] 652
[1] 653
[1] 654
[1] 655
[1] 656
[1] 657
[1] 658
[1] 659
[1] 660
[1] 661
[1] 662
[1] 663
[1] 664
[1] 665
[1] 666
[1] 667
[1] 668
[1] 669
[1] 670
[1] 671
[1] 672
[1] 673
[1] 674
[1] 675
[1] 676
[1] 677
[1] 678
[1] 679
[1] 680
[1] 681
[1] 682
[1] 683
[1] 684
[1] 685
[1] 686
[1] 687
[1] 688
[1] 689
[1] 690
[1] 691
[1] 692
[1] 693
[1] 694
[1] 695
[1] 696
[1] 697
[1] 698
[1] 699
[1] 700
[1] 701
[1] 702
[1] 703
[1] 704
[1] 705
[1] 706
[1] 707
[1] 708
[1] 709
[1] 710
[1] 711
[1] 712
[1] 713
[1] 714
[1] 715
[1] 716
[1] 717
[1] 718
[1] 719
[1] 720
[1] 721
[1] 722
[1] 723
[1] 724
[1] 725
[1] 726
[1] 727
[1] 728
[1] 729
[1] 730
[1] 731
[1] 732
[1] 733
[1] 734
[1] 735
[1] 736
[1] 737
[1] 738
[1] 739
[1] 740
[1] 741
[1] 742
[1] 743
[1] 744
[1] 745
[1] 746
[1] 747
[1] 748
[1] 749
[1] 750
[1] 751
[1] 752
[1] 753
[1] 754
[1] 755
[1] 756
[1] 757
[1] 758
[1] 759
[1] 760
[1] 761
[1] 762
[1] 763
[1] 764
[1] 765
[1] 766
[1] 767
[1] 768
[1] 769
[1] 770
[1] 771
[1] 772
[1] 773
[1] 774
[1] 775
[1] 776
[1] 777
[1] 778
[1] 779
[1] 780
[1] 781
[1] 782
[1] 783
[1] 784
[1] 785
[1] 786
[1] 787
[1] 788
[1] 789
[1] 790
[1] 791
[1] 792
[1] 793
[1] 794
[1] 795
[1] 796
[1] 797
[1] 798
[1] 799
[1] 800
[1] 801
[1] 802
[1] 803
[1] 804
[1] 805
[1] 806
[1] 807
[1] 808
[1] 809
[1] 810
[1] 811
[1] 812
[1] 813
[1] 814
[1] 815
[1] 816
[1] 817
[1] 818
[1] 819
[1] 820
[1] 821
[1] 822
[1] 823
[1] 824
[1] 825
[1] 826
[1] 827
[1] 828
[1] 829
[1] 830
[1] 831
[1] 832
[1] 833
[1] 834
[1] 835
[1] 836
[1] 837
[1] 838
[1] 839
[1] 840
[1] 841
[1] 842
[1] 843
[1] 844
[1] 845
[1] 846
[1] 847
[1] 848
[1] 849
[1] 850
[1] 851
[1] 852
[1] 853
[1] 854
[1] 855
[1] 856
[1] 857
[1] 858
[1] 859
[1] 860
[1] 861
[1] 862
[1] 863
[1] 864
[1] 865
[1] 866
[1] 867
[1] 868
[1] 869
[1] 870
[1] 871
[1] 872
[1] 873
[1] 874
[1] 875
[1] 876
[1] 877
[1] 878
[1] 879
[1] 880
[1] 881
[1] 882
[1] 883
[1] 884
[1] 885
[1] 886
[1] 887
[1] 888
[1] 889
[1] 890
[1] 891
[1] 892
[1] 893
[1] 894
[1] 895
[1] 896
[1] 897
[1] 898
[1] 899
[1] 900
[1] 901
[1] 902
[1] 903
[1] 904
[1] 905
[1] 906
[1] 907
[1] 908
[1] 909
[1] 910
[1] 911
[1] 912
[1] 913
[1] 914
[1] 915
[1] 916
[1] 917
[1] 918
[1] 919
[1] 920
[1] 921
[1] 922
[1] 923
[1] 924
[1] 925
[1] 926
[1] 927
[1] 928
[1] 929
[1] 930
[1] 931
[1] 932
[1] 933
[1] 934
[1] 935
[1] 936
[1] 937
[1] 938
[1] 939
[1] 940
[1] 941
[1] 942
[1] 943
[1] 944
[1] 945
[1] 946
[1] 947
[1] 948
[1] 949
[1] 950
[1] 951
[1] 952
[1] 953
[1] 954
[1] 955
[1] 956
[1] 957
[1] 958
[1] 959
[1] 960
[1] 961
[1] 962
[1] 963
[1] 964
[1] 965
[1] 966
[1] 967
[1] 968
[1] 969
[1] 970
[1] 971
[1] 972
[1] 973
[1] 974
[1] 975
[1] 976
[1] 977
[1] 978
[1] 979
[1] 980
[1] 981
[1] 982
[1] 983
[1] 984
[1] 985
[1] 986
[1] 987
[1] 988
[1] 989
[1] 990
[1] 991
[1] 992
[1] 993
[1] 994
[1] 995
[1] 996
[1] 997
[1] 998
[1] 999
[1] 1000
  
#reduce to mean and standard deviation
predicted_dissim_trends_rnormruns_constanttempfishing[,mean_dissim_coef:= mean(estimate),survey_unit][,sd_dissim := sd(estimate),.(survey_unit)]

predicted_dissim_trends_rnormrunsconstant_tempfishing.summary <- unique(predicted_dissim_trends_rnormruns_constanttempfishing[,.(survey_unit, mean_dissim_coef, sd_dissim)])

predicted_dissim_trends_rnormrunsconstant_tempfishing.summary[,pred_type := "fishing_and_temp_constant"]

predicted_dissim_trends_rnormruns.summary <- rbind(predicted_dissim_trends_rnormruns.summary, predicted_dissim_trends_rnormrunsconstant_tempfishing.summary)

Plotting observed vs predicted


jaccard_fishing_temp_model_observed_predicted_dt <- jaccard_total_coefs.r[predicted_dissim_trends_rnormruns.summary, on = "survey_unit"]

jaccard_fishing_temp_model_observed_predicted_dt[,pred_lower := mean_dissim_coef-sd_dissim][,pred_upper := mean_dissim_coef+sd_dissim]

#FULL MODEL, both temperature and fishing are allowed to vary
jaccard_fishing_temp_model_observed_predicted_lm <- lm(estimate ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "full"])
summary(jaccard_fishing_temp_model_observed_predicted_lm) #R^2 0.56

Call:
lm(formula = estimate ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == 
    "full"])

Residuals:
       Min         1Q     Median         3Q        Max 
-1.981e-03 -4.928e-04 -2.084e-05  4.691e-04  2.458e-03 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)      -0.0002468  0.0001763  -1.399    0.172    
mean_dissim_coef  1.3529728  0.1587727   8.521 1.65e-09 ***
---
Signif. codes:  0 ā€˜***’ 0.001 ā€˜**’ 0.01 ā€˜*’ 0.05 ā€˜.’ 0.1 ā€˜ ’ 1

Residual standard error: 0.0009676 on 30 degrees of freedom
Multiple R-squared:  0.7076,    Adjusted R-squared:  0.6979 
F-statistic: 72.61 on 1 and 30 DF,  p-value: 1.652e-09
(jaccard_fishing_temp_model_observed_predicted <- ggplot(jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "full"]) +
  geom_errorbar(aes(x = mean_dissim_coef, ymin = lwr, ymax = upr), color = "lightgrey", linewidth = 0.4) +
  geom_errorbarh(aes(y = estimate, xmin = mean_dissim_coef-sd_dissim, xmax = mean_dissim_coef+sd_dissim), color = "lightgrey", linewidth = 0.4) +
  geom_point(aes(y = estimate, x = mean_dissim_coef)) +
  geom_smooth(aes(y = estimate, x = mean_dissim_coef), color = "darkgrey",linetype = "dotted", method = "lm") +
  geom_abline(aes(slope = 1, intercept = 0)) +
  lims(x = c(min(jaccard_fishing_temp_model_observed_predicted_dt$pred_lower),max(jaccard_fishing_temp_model_observed_predicted_dt$pred_upper))) +
  labs(y = "Observed β-diversity trend",x = "Predicted β-diversity trend\n") +
  theme_classic()
)


#fishing constant (fishing constant; temperature varies only)
jaccard_fishing_constant_model_observed_predicted_lm <- lm(estimate ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "fishing_constant"])
summary(jaccard_fishing_constant_model_observed_predicted_lm) 

Call:
lm(formula = estimate ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == 
    "fishing_constant"])

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0025999 -0.0008489 -0.0000433  0.0009975  0.0036107 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)      -2.491e-05  2.455e-04  -0.101     0.92    
mean_dissim_coef  1.457e+00  3.207e-01   4.544 8.41e-05 ***
---
Signif. codes:  0 ā€˜***’ 0.001 ā€˜**’ 0.01 ā€˜*’ 0.05 ā€˜.’ 0.1 ā€˜ ’ 1

Residual standard error: 0.001377 on 30 degrees of freedom
Multiple R-squared:  0.4077,    Adjusted R-squared:  0.388 
F-statistic: 20.65 on 1 and 30 DF,  p-value: 8.405e-05
#Temperature as a predictor, not fishing = R^2 = 0.40 (drop in 16% of variance explained when you lose fishing as predictor)

(jaccard_fishing_constant_model_observed_predicted <- ggplot(jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "fishing_constant"]) +
geom_errorbar(aes(x = mean_dissim_coef, ymin = lwr, ymax = upr), color = "lightgrey", linewidth = 0.4) +
  geom_errorbarh(aes(y = estimate, xmin = mean_dissim_coef-sd_dissim, xmax = mean_dissim_coef+sd_dissim), color = "lightgrey", linewidth = 0.4) +
  geom_point(aes(y = estimate, x = mean_dissim_coef)) +
    geom_smooth(aes(y = estimate, x = mean_dissim_coef), color = "darkgrey",linetype = "dotted", method = "lm") +
  geom_abline(aes(slope = 1, intercept = 0)) +
      lims(x = c(min(jaccard_fishing_temp_model_observed_predicted_dt$pred_lower),max(jaccard_fishing_temp_model_observed_predicted_dt$pred_upper))) +
  labs(y = "Observed β-diversity trend",x = "Predicted β-diversity trend\n(temperature varies fishing constant)") +
  theme_classic()
)


#temp constant (fishing only; temperature constant)
jaccard_temperature_constant_model_observed_predicted_lm <- lm(estimate ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "temp_constant"])
summary(jaccard_temperature_constant_model_observed_predicted_lm) #0.26 Drop in 30% of variance explained when you lose temperature as a predictor

Call:
lm(formula = estimate ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == 
    "temp_constant"])

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0024512 -0.0006681 -0.0001330  0.0005932  0.0041511 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)      -0.0001441  0.0002462  -0.585    0.563    
mean_dissim_coef  1.1430642  0.2425337   4.713 5.23e-05 ***
---
Signif. codes:  0 ā€˜***’ 0.001 ā€˜**’ 0.01 ā€˜*’ 0.05 ā€˜.’ 0.1 ā€˜ ’ 1

Residual standard error: 0.001356 on 30 degrees of freedom
Multiple R-squared:  0.4254,    Adjusted R-squared:  0.4063 
F-statistic: 22.21 on 1 and 30 DF,  p-value: 5.233e-05
(jaccard_temperature_constant_model_observed_predicted <- ggplot(jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "temp_constant"]) +
  geom_errorbar(aes(x = mean_dissim_coef, ymin = lwr, ymax = upr), color = "lightgrey", linewidth = 0.4) +
  geom_errorbarh(aes(y = estimate, xmin = mean_dissim_coef-sd_dissim, xmax = mean_dissim_coef+sd_dissim), color = "lightgrey", linewidth = 0.4) +
  geom_point(aes(y = estimate, x = mean_dissim_coef)) +
    geom_smooth(aes(y = estimate, x = mean_dissim_coef), color = "darkgrey",linetype = "dotted", method = "lm") +
  geom_abline(aes(slope = 1, intercept = 0)) +
      lims(x = c(min(jaccard_fishing_temp_model_observed_predicted_dt$pred_lower),max(jaccard_fishing_temp_model_observed_predicted_dt$pred_upper))) +
  labs(y = "Observed β-diversity trend",x = "Predicted β-diversity trend\n(fishing varies temperature constant)") +
  theme_classic()
)


#both temperature and fish held constant
jaccard_fishing_temp_model_observed_predicted_tempfishconstantinsurvey_lm <- lm(estimate ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "fishing_and_temp_constant"])
summary(jaccard_fishing_temp_model_observed_predicted_tempfishconstantinsurvey_lm) #%20 #drop of 36 from full

Call:
lm(formula = estimate ~ mean_dissim_coef, data = jaccard_fishing_temp_model_observed_predicted_dt[pred_type == 
    "fishing_and_temp_constant"])

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0028303 -0.0008635 -0.0002650  0.0007648  0.0036342 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)  
(Intercept)      0.0000260  0.0002849   0.091   0.9279  
mean_dissim_coef 1.5781086  0.5750546   2.744   0.0101 *
---
Signif. codes:  0 ā€˜***’ 0.001 ā€˜**’ 0.01 ā€˜*’ 0.05 ā€˜.’ 0.1 ā€˜ ’ 1

Residual standard error: 0.0016 on 30 degrees of freedom
Multiple R-squared:  0.2007,    Adjusted R-squared:  0.174 
F-statistic: 7.531 on 1 and 30 DF,  p-value: 0.01014
(jaccard_fishing_temp_model_observed_predicted_tempfishconstantinsurvey <- ggplot(jaccard_fishing_temp_model_observed_predicted_dt[pred_type == "fishing_and_temp_constant"]) +
geom_errorbar(aes(x = mean_dissim_coef, ymin = lwr, ymax = upr), color = "lightgrey", linewidth = 0.4) +
  geom_errorbarh(aes(y = estimate, xmin = mean_dissim_coef-sd_dissim, xmax = mean_dissim_coef+sd_dissim), color = "lightgrey", linewidth = 0.4) +
  geom_point(aes(y = estimate, x = mean_dissim_coef)) +
    geom_smooth(aes(y = estimate, x = mean_dissim_coef), color = "darkgrey",linetype = "dotted", method = "lm")+
  geom_abline(aes(slope = 1, intercept = 0)) +
      lims(x = c(min(jaccard_fishing_temp_model_observed_predicted_dt$pred_lower),max(jaccard_fishing_temp_model_observed_predicted_dt$pred_upper))) +
  labs(y = "Observed β-diversity trend",x = "Predicted β-diversity trend\n(fishing and temperature constant)") +
  theme_classic()
)


#merge
jaccard_fishing_sbt_model_observed_predicted_merge <- plot_grid(jaccard_fishing_temp_model_observed_predicted + theme(plot.margin = unit(c(0.1,0.3,0.1,0.1),"cm")),
                                                                     jaccard_fishing_constant_model_observed_predicted + theme(plot.margin = unit(c(0.1,0.3,0.1,0.1),"cm")),
                                                                     jaccard_temperature_constant_model_observed_predicted + theme(plot.margin = unit(c(0.1,0.3,0.1,0.1),"cm")),
                                                                     jaccard_fishing_temp_model_observed_predicted_tempfishconstantinsurvey + theme(plot.margin = unit(c(0.1,0.3,0.1,0.1),"cm")), ncol = 2, labels = c("a.","b.","c.","d."))
`geom_smooth()` using formula = 'y ~ x'`geom_smooth()` using formula = 'y ~ x'`geom_smooth()` using formula = 'y ~ x'`geom_smooth()` using formula = 'y ~ x'
ggsave(jaccard_fishing_sbt_model_observed_predicted_merge, path = here::here("figures"),filename = "jaccard_fishing_sbt_model_observed_predicted_merge.jpg", height =6, width = 8)

NA
NA

###Let’s visualize model coefficients with temperature and fishing (similar to figure 2)


#extract coefficients using linear algebra
interaction_avg_model_coef <- data.table(lm_interaction_coefficients_se(mod_name = model_avg_delta4, model_avg = T, SBT_fish = T))

#add survey names
interaction_avg_model_coef[,survey_unit := factor(c(all_surveys[!all_surveys %in% c("ROCKALL", "GSL-S")],all_surveys[!all_surveys %in% c("ROCKALL", "GSL-S")]))]

#add predictor names
interaction_avg_model_coef[,predictor := c(rep("Relative fishing catch",32),rep("Minimum temperature",32))]

#reorder temperature and fishing
interaction_avg_model_coef[,predictor := factor(predictor, levels = c("Minimum temperature","Relative fishing catch"))]

#link for full survey name
interaction_avg_model_coef <- color_link[interaction_avg_model_coef, on = "survey_unit"]

#list of Survey Name Season in order by survey unit
setkey(interaction_avg_model_coef, survey_unit)

survey_name_season_ordered <- unique(interaction_avg_model_coef$Survey_Name_Season)

#Make Survey_Name_Season a factor
interaction_avg_model_coef[,Survey_Name_Season := factor(Survey_Name_Season, levels = survey_name_season_ordered)]


#mark significance
interaction_avg_model_coef[,Significant := ifelse((estimate-se > 0 & estimate+se > 0) | (estimate-se < 0 & estimate+se < 0),T,F)]


#Plot both
sbt_fishing_avg_model_coef <- ggplot() +
  geom_hline(yintercept = 0, linetype = "dotted") +
geom_point(data = interaction_avg_model_coef, aes(x = Survey_Name_Season, y = estimate, color = Significant)) +  
geom_errorbar(data = interaction_avg_model_coef, aes(x = Survey_Name_Season, ymin = estimate-se, ymax = estimate+se, color = Significant), width = 0) +
  scale_color_manual(values = c("darkgrey","black")) +
facet_wrap(~predictor, scales = "free_x") +
scale_x_discrete(limits = rev) +
  labs(y = "Coefficient", x = "") +
coord_flip() +
theme_classic()
  
interaction_avg_model_coef
NA

Plot all other coefficients in averaged model

model_avg_values.nonfishortemp <- model_avg_values[c(2,3,4,8,104,105,106),]

#mark significance
model_avg_values.nonfishortemp[,Significant := ifelse((coef-se > 0 & coef+se > 0) | (coef-se < 0 & coef+se < 0),T,F)]

#more helpful names for variables
model_avg_values.nonfishortemp[,Variable := c("Area","Depth","Latitude","Species count","Number of tows","Latitude range","Depth range")]

#make factor with order
model_avg_values.nonfishortemp[,Variable := factor(Variable, levels = c("Area","Species count","Number of tows","Depth","Depth range","Latitude","Latitude range"))]


#plot
all_avg_model_coef <- ggplot() + 
geom_point(data = model_avg_values.nonfishortemp, aes(x = Variable, y = coef, color = Significant)) +  
geom_errorbar(data = model_avg_values.nonfishortemp, aes(x = Variable, ymin = coef-se, ymax = coef+se, color = Significant), width = 0) +
  scale_color_manual(values = c("darkgrey","black")) +
geom_hline(yintercept = 0) +
scale_x_discrete(limits = rev) +
  labs(y = "Coefficient", x = "\n\n\n") +
coord_flip() +
theme_classic()

#plot
all_but_lat_avg_model_coef <- ggplot() + 
geom_point(data = model_avg_values.nonfishortemp[Variable == "Latitude"], aes(x = Variable, y = coef, color = Significant)) +  
geom_errorbar(data = model_avg_values.nonfishortemp[Variable == "Latitude"], aes(x = Variable, ymin = coef-se, ymax = coef+se, color = Significant), width = 0) +
  scale_color_manual(values = c("darkgrey","black")) +
geom_hline(yintercept = 0) +
scale_x_discrete(limits = rev) +
  labs(y = "Coefficient", x = "Model variable") +
coord_flip() +
theme_classic()

#plot
lat_avg_model_coef <- ggplot() + 
geom_point(data = model_avg_values.nonfishortemp[Variable != "Latitude"], aes(x = Variable, y = coef, color = Significant)) +  
geom_errorbar(data = model_avg_values.nonfishortemp[Variable != "Latitude"], aes(x = Variable, ymin = coef-se, ymax = coef+se, color = Significant), width = 0) +
  scale_color_manual(values = c("darkgrey","black")) +
geom_hline(yintercept = 0) +
scale_x_discrete(limits = rev) +
  labs(y = "Coefficient", x = "Model variable") +
coord_flip() +
theme_classic()

#merge into single plot

model_coef_summary_sbt_jaccard <- cowplot::plot_grid(sbt_fishing_avg_model_coef+theme(legend.position = "null", axis.title.x = element_blank()),all_avg_model_coef+theme(legend.position = "null"), ncol = 1, labels = c("  a.                                                      b.","        c."), label_y = 0.99, rel_heights = c(3,1))

#Figure 3
ggsave(model_coef_summary_sbt_jaccard, path = here::here("figures"),filename = "model_coef_summary_sbt_jaccard.jpg", height = 6.5, width = 8, unit = "in")
ggsave(model_coef_summary_sbt_jaccard, path = here::here("figures"),filename = "Fig3.tiff", height = 6.5, width = 8, unit = "in", dpi = 300, compression = "lzw")

###Investigating what’s going on with Aleutian Islands

What leads to variance being explained by variables OTHER than temperature in coldest years So, in summary - Very large sampling area and very small sampling areas are both linked to years of low dissimilarity - Very large sampling area coincides with lowest temperatures - Annual dissimilarity value increases with richness - Lowest temperature observation coincides with lowest richness - Low number of hauls led to very low annual dissimilarity values - Lowest temperature matched with lowest number of samples - Some deep trawls have very low annual dissimilarity, while other deep trawls have high annual dissimilarity - Deepest trawls happened on cold days

For the Aleutian islands, the coldest years were also: - the years of largest sampling area - the years of lowest richness - the years of lowest sampling effort (# tows) - the years of deepest sampling

#IF WE ACTUALLY USE THIS, NEED TO UPDATE ##Show intercepts by region and season # #{r} # ##survey intercepts #survey_intercepts <- model_avg_values[c(1,8:38),.(coef_name, coef, se)] #survey_intercepts[1,survey_unit := "AI"][1,coef_true := coef] #survey_intercepts[2:32,survey_unit := substr(coef_name, 12, str_length(coef_name))][2:32,coef_true := survey_intercepts[1,coef_true]+coef] #survey_intercepts <- color_link[survey_intercepts, on = "survey_unit"] #survey_intercepts[,Survey_Name_Season := reorder(Survey_Name_Season, coef_true)] # # ##season_intercepts #season_intercepts <- model_avg_values[c(1,3:5),.(coef_name, coef, se)] #season_intercepts[1,season := "Spring"][1,coef_true := coef] #season_intercepts[2:4,season := substr(coef_name, 7, str_length(coef_name))][2:4,coef_true := season_intercepts[1,coef_true]+coef] #season_intercepts[,season := reorder(season, coef_true)] # # ##survey intercepts #survey_model_coef <- ggplot() + #geom_point(data = survey_intercepts, aes(x = Survey_Name_Season, y = coef_true)) + #geom_errorbar(data = survey_intercepts, aes(x = Survey_Name_Season, ymin = coef_true-se, ymax = coef_true+se), width = 0) + #scale_x_discrete(limits = rev) + ## ylim(0.35,1) + # labs(y = "Intercept", x = "") + #coord_flip() + #theme_classic() # ##season intercepts #season_model_coef <- ggplot() + #geom_point(data = season_intercepts, aes(x = season, y = coef_true)) + #geom_errorbar(data = season_intercepts, aes(x = season, ymin = coef_true-se, ymax = coef_true+se), width = 0) + #scale_x_discrete(limits = rev) + # # ylim(0.35,1) + # labs(y = "Intercept", x = "") + #coord_flip() + #theme_classic() # ##merge into single plot # #model_intercept_jaccard <- cowplot::plot_grid(survey_model_coef+theme(axis.title.x = element_blank()), # season_model_coef, ncol = 1, labels = c("a.","b."), label_y = 0.99, rel_heights = c(3,1), align = "v") # #ggsave(model_intercept_jaccard, path = here::here("figures"),filename = "model_intercept_jaccard.jpg", height = 6.5, width = 6.5, unit = "in") # # # ##

LS0tCnRpdGxlOiAiTW9kZWwgYW5udWFsIGRpc3NpbWlsYXJpdHkgd2l0aCB0ZW1wZXJhdHVyZSwgZmlzaGluZywgYW5kIHN1cnZleSBpZGVudGl0eSIKb3V0cHV0OiBodG1sX25vdGVib29rCmF1dGhvcjogWm/DqyBKLiBLaXRjaGVsCmRhdGU6IE1heSA2LCAyMDI0Ci0tLQoKU2NyaXB0IDggZm9yIEtpdGNoZWwgZXQgYWwuIDIwMjQgaW4gcHJlcCB0YXhvbm9taWMgZGl2ZXJzaXR5IG1hbnVzY3JpcHQuCgoKYGBge3Igc2V0dXB9CmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShNdU1JbikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkobG1lNCkKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KG5sbWUpCgojcHVsbCBpbiBmdW5jdGlvbiB0byBjYWxjdWxhdGUgbW9kZWwgZXN0aW1hdGVzIGFuZCBzdGFuZGFyZCBlcnJvcnMKc291cmNlKGhlcmU6OmhlcmUoImFuYWx5c2lzX2NvZGUiLCJleHRyYWN0X2NvZWZmaWNpZW50c19mdW5jdGlvbi5SIikpCmBgYAoKIyMjUHJlZGljdHMgYW5udWFsIGRpc3NpbWlsYXJpdHkgd2l0aCBhbm51YWwgY2hhcmFjdGVyaXN0aWNzLCB0ZW1wZXJhdHVyZSBhbmQgZmlzaGluZyB2YWx1ZXMKClB1bGwgaW4KLSByZWdpb24gYXJlYXMgKGlmIG5vdCBhbHJlYWR5IGxvYWRlZCkKLSByZWdpb24gY2hhcmFjdGVyaXN0aWNzIChpZiBub3QgYWxyZWFkeSBsb2FkZWQpOyBzYXZlUkRTKEZpc2hHbG9iX3JpY2huZXNzX3llYXJfc3VydmV5LCBmaWxlID0gaGVyZTo6aGVyZSgib3V0cHV0IiwiRmlzaEdsb2JfcmljaG5lc3NfeWVhcl9zdXJ2ZXkuUmRzIikpCi0gZmlzaGluZyAoaWYgbm90IGFscmVhZHkgbG9hZGVkKQotIHRlbXAgKGlmIG5vdCBhbHJlYWR5IGxvYWRlZCkKCgpBZGQgc3VydmV5IGFyZWEgdG8gZGlzc2ltaWxhcml0aWVzIGRhdGEgdGFibGUKYGBge3J9CiNwaHlzaWNhbCBhcmVhIGJ5IHllYXIKcmVnaW9uX2FyZWFfYnl5ZWFyIDwtIGZyZWFkKGhlcmU6OmhlcmUoIm91dHB1dCIsInJlZ2lvbl9hcmVhX2J5eWVhci5jc3YiKSkKCiNtZXJnZWQgZmlzaGluZywgdGVtcCwgZGlzc2ltaWxhcml0aWVzCmRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmcgPC0gZnJlYWQoaGVyZTo6aGVyZSgib3V0cHV0IiwiZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZy5jc3YiKSkKCiNjb21iaW5lCmRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYSA8LSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nW3JlZ2lvbl9hcmVhX2J5eWVhciwgb24gPSBjKCJzdXJ2ZXlfdW5pdCIsInllYXIiKV0KCiNvbmx5IG9jY3VycmVuY2UtYmFzZWQgamFjY2FyZCBmb3IgdGhlc2UgYW5hbHlzZXMKZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmQgPC0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhW2Rpc3NpbWlsYXJpdHlfbWV0cmljID09ICJqYWNjYXJkX2Rpc3NpbWlsYXJpdHlfaW5kZXhfYmluYXJ5IixdCmBgYAoKQWRkIGluIHNlYXNvbi9KdWxpYW4gZGF5IHRvIGRpc3NpbWlsYXJpdGllcyBkYXRhIHRhYmxlCmBgYHtyfQojbG9hZCB1cCBqdWxpYW4gZGF5cwpkYXRlc19yZWdpb25zIDwtIHJlYWRSRFMoaGVyZTo6aGVyZSgib3V0cHV0IiwiZGF0ZXNfcmVnaW9ucy5yZHMiKSkKCiNtb3N0IGNvbW1vbiBzZWFzb24gcGVyIHllYXIKIyBGdW5jdGlvbiB0byBnZXQgdGhlIG1vc3QgZnJlcXVlbnQgdmFsdWUKZ2V0X21vZGUgPC0gZnVuY3Rpb24oeCkgewogIHV4IDwtIHVuaXF1ZSh4KQogIHV4W3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh4LCB1eCkpKV0KfQoKIyBBcHBseSB0aGUgZnVuY3Rpb24gdG8gZWFjaCBncm91cApkYXRlc19yZWdpb25zLnIgPC0gZGF0ZXNfcmVnaW9uc1ssIC4oc2Vhc29uID0gZ2V0X21vZGUoc2Vhc29uKSksIGJ5ID0gYygic3VydmV5X3VuaXQiLCJ5ZWFyIildCgoKI21lcmdlCmRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkIDwtIGRhdGVzX3JlZ2lvbnMucltkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZCwgb24gPSBjKCJzdXJ2ZXlfdW5pdCIsInllYXIiKV0KYGBgCgogClB1bGwgaW4gcGFsZXR0ZSBhbmQgbmFtZSBoZWxwZXIKYGBge3J9CnNvdXJjZShoZXJlOjpoZXJlKCJhbmFseXNpc19jb2RlIiwiY29sb3JfbGlua3MuUiIpKQpgYGAKClB1bGwgaW4gb2JzZXJ2ZWQgZGlzc2ltaWxhcml0eSB0cmVuZCB2YWx1ZXMKYGBge3J9CmphY2NhcmRfdG90YWxfY29lZnMuciA8LSBmcmVhZChoZXJlOjpoZXJlKCJvdXRwdXQiLCJqYWNjYXJkX3RvdGFsX2NvZWZzLnIuY3N2IikpCmBgYAoKUGxvdCBmaXNoaW5nIGFuZCB0ZW1wZXJhdHVyZSB2cy4gdGltZSBmb3IgYWxsIHJlZ2lvbnMKYGBge3J9CiMjIyMjIyNURU1QRVJBVFVSRQoKI3NldCBvcmRlciBieSBzdXJ2ZXkgdW5pdCBmb3IgcGxvdHRpbmcKYWxsX3N1cnZleXMgPC0gbGV2ZWxzKGFzLmZhY3RvcihkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZCRzdXJ2ZXlfdW5pdCkpCnNldG9yZGVyKGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkLCBzdXJ2ZXlfdW5pdCkKCmRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkWyxTdXJ2ZXlfTmFtZV9TZWFzb246PWZhY3RvcihTdXJ2ZXlfTmFtZV9TZWFzb24sIGxldmVscyA9IHVuaXF1ZShkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZCRTdXJ2ZXlfTmFtZV9TZWFzb24pLCBvcmRlcmVkID0gVCldCgooc2J0X3RpbWVfc3VydmV5X2ZhY2V0XzFfMjAgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFtzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzWzE6MjBdICYgeWVhciA+IDE5NzldKSArCiAgbGFicyh5ID0gIk1lYW4gYm90dG9tIHRlbXBlcmF0dXJlICjLmkMpIiwgIHggPSAiWWVhciIpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gYXMubnVtZXJpYyh5ZWFybHlfbWVhbl9ieXBvaW50X2F2ZyksIHggPSB5ZWFyKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeSA9IGFzLm51bWVyaWMoeWVhcmx5X21lYW5fYnlwb2ludF9hdmcpLCB4ID0geWVhciksIG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gfiBheGlzVGlja3MoLiwgbG9nID0gRkFMU0UpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIHNjYWxlcz0gImZyZWUiLCBuY29sID0gNCkpCgpnZ3NhdmUoc2J0X3RpbWVfc3VydmV5X2ZhY2V0XzFfMjAsIHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiksIGZpbGVuYW1lID0gInNidF90aW1lX3N1cnZleV9mYWNldF8xXzIwLmpwZyIsIGhlaWdodCA9IDEyLCB3aWR0aCA9OSkKCihzYnRfdGltZV9zdXJ2ZXlfZmFjZXRfMjFfMzQgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFtzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzWzIxOjM0XSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeSA9ICJNZWFuIGJvdHRvbSB0ZW1wZXJhdHVyZSAoy5pDKSIsICB4ID0gIlllYXIiKSArCiAgZ2VvbV9wb2ludChhZXMoeSA9IGFzLm51bWVyaWMoeWVhcmx5X21lYW5fYnlwb2ludF9hdmcpLCB4ID0geWVhciksIGFscGhhID0gMC4zKSArCiAgZ2VvbV9zbW9vdGgoYWVzKHkgPSBhcy5udW1lcmljKHllYXJseV9tZWFuX2J5cG9pbnRfYXZnKSwgeCA9IHllYXIpLCBtZXRob2QgPSAibG0iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IH4gYXhpc1RpY2tzKC4sIGxvZyA9IEZBTFNFKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArCiAgZmFjZXRfd3JhcCh+U3VydmV5X05hbWVfU2Vhc29uLCBzY2FsZXM9ICJmcmVlIiwgbmNvbCA9IDQpKQoKZ2dzYXZlKHNidF90aW1lX3N1cnZleV9mYWNldF8yMV8zNCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAic2J0X3RpbWVfc3VydmV5X2ZhY2V0XzIxXzM0LmpwZyIsIGhlaWdodCA9IDEyLCB3aWR0aCA9OSkKCiMjIyMjIyNGSVNISU5HCgpkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZC5jYyA8LSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFtjb21wbGV0ZS5jYXNlcyhkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFssc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWddKSxdCgooZmlzaGluZ190aW1lX3N1cnZleV9mYWNldF8xXzIwIDwtIGdncGxvdChkYXRhID0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmQuY2Nbc3VydmV5X3VuaXQgJWluJSBhbGxfc3VydmV5c1sxOjIwXSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeSA9ICJSZWxhdGl2ZSBmaXNoaW5nIGNhdGNoIiwgIHggPSAiWWVhciIpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcsIHggPSB5ZWFyKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeSA9IHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnLCB4ID0geWVhciksIG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gfiBheGlzVGlja3MoLiwgbG9nID0gRkFMU0UpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIHNjYWxlcz0gImZyZWUiLCBuY29sID0gNCkpCgpnZ3NhdmUoZmlzaGluZ190aW1lX3N1cnZleV9mYWNldF8xXzIwLCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLCBmaWxlbmFtZSA9ICJmaXNoaW5nX3RpbWVfc3VydmV5X2ZhY2V0XzFfMjAuanBnIiwgaGVpZ2h0ID0gMTIsIHdpZHRoID05KQoKKGZpc2hpbmdfdGltZV9zdXJ2ZXlfZmFjZXRfMjFfMzQgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZC5jY1tzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzW2MoMjE6MzQpXSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeSA9ICJSZWxhdGl2ZSBmaXNoaW5nIGNhdGNoIiwgIHggPSAiWWVhciIpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcsIHggPSB5ZWFyKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeSA9IHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnLCB4ID0geWVhciksIG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gfiBheGlzVGlja3MoLiwgbG9nID0gRkFMU0UpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIHNjYWxlcz0gImZyZWUiLCBuY29sID0gNCkpCgpnZ3NhdmUoZmlzaGluZ190aW1lX3N1cnZleV9mYWNldF8yMV8zNCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAiZmlzaGluZ190aW1lX3N1cnZleV9mYWNldF8yMV8zNC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgoKYGBgCgpQbG90IGZpc2hpbmcgYW5kIHRlbXBlcmF0dXJlIHZzLiBkaXNzaW1pbGFyaXR5IGZvciBhbGwgcmVnaW9ucwpgYGB7cn0KIyMjIyNNRUFOIFRFTVAKKHByZWRzX3NidF9tZWFuX3RlbXBfc3VydmV5X2ZhY2V0XzFfMjAgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFtzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzWzE6MjBdICYgeWVhciA+IDE5NzldKSArCiAgbGFicyh4ID0gIk1lYW4gYm90dG9tIHRlbXBlcmF0dXJlICjLmkMpIiwgIHkgPSAizrItZGl2ZXJzaXR5IikgKwogIGdlb21fcG9pbnQoYWVzKHggPSBhcy5udW1lcmljKHllYXJseV9tZWFuX2J5cG9pbnRfYXZnKSwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeCA9IGFzLm51bWVyaWMoeWVhcmx5X21lYW5fYnlwb2ludF9hdmcpLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpLCBtZXRob2QgPSAibG0iKSArCiAgZmFjZXRfd3JhcCh+U3VydmV5X05hbWVfU2Vhc29uLCBzY2FsZXM9ICJmcmVlIiwgbmNvbCA9IDQpICsKICB0aGVtZV9jbGFzc2ljKCkpCgpnZ3NhdmUocHJlZHNfc2J0X21lYW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMV8yMCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAicHJlZHNfc2J0X21lYW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMV8yMC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgoocHJlZHNfc2J0X21lYW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMjFfMzQgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFtzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzWzIxOjM0XSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeCA9ICJNZWFuIGJvdHRvbSB0ZW1wZXJhdHVyZSAoy5pDKSIsICB5ID0gIs6yLWRpdmVyc2l0eSIpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gYXMubnVtZXJpYyh5ZWFybHlfbWVhbl9ieXBvaW50X2F2ZyksIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSksIGFscGhhID0gMC4zKSArCiAgZ2VvbV9zbW9vdGgoYWVzKHggPSBhcy5udW1lcmljKHllYXJseV9tZWFuX2J5cG9pbnRfYXZnKSwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgbWV0aG9kID0gImxtIikgKwogIGZhY2V0X3dyYXAoflN1cnZleV9OYW1lX1NlYXNvbiwgc2NhbGVzPSAiZnJlZSIsIG5jb2wgPSA0KSArCiAgdGhlbWVfY2xhc3NpYygpKQoKZ2dzYXZlKHByZWRzX3NidF9tZWFuX3RlbXBfc3VydmV5X2ZhY2V0XzIxXzM0LCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLCBmaWxlbmFtZSA9ICJwcmVkc19zYnRfbWVhbl90ZW1wX3N1cnZleV9mYWNldF8yMV8zNC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgojIyMjI01JTklNVU0gVEVNUAoocHJlZHNfc2J0X21pbl90ZW1wX3N1cnZleV9mYWNldF8xXzIwIDwtIGdncGxvdChkYXRhID0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmRbc3VydmV5X3VuaXQgJWluJSBhbGxfc3VydmV5c1sxOjIwXSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeCA9ICJNaW5pbXVtIGJvdHRvbSB0ZW1wZXJhdHVyZSAoy5pDKSIsICB5ID0gIs6yLWRpdmVyc2l0eSIpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gYXMubnVtZXJpYyh5ZWFybHlfbWluX2J5cG9pbnRfYXZnKSwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeCA9IGFzLm51bWVyaWMoeWVhcmx5X21pbl9ieXBvaW50X2F2ZyksIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSksIG1ldGhvZCA9ICJsbSIpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIHNjYWxlcz0gImZyZWUiLCBuY29sID0gNCkgKwogIHRoZW1lX2NsYXNzaWMoKSkKCmdnc2F2ZShwcmVkc19zYnRfbWluX3RlbXBfc3VydmV5X2ZhY2V0XzFfMjAsIHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiksIGZpbGVuYW1lID0gInByZWRzX3NidF9taW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMV8yMC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgoocHJlZHNfc2J0X21pbl90ZW1wX3N1cnZleV9mYWNldF8yMV8zNCA8LSBnZ3Bsb3QoZGF0YSA9IGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkW3N1cnZleV91bml0ICVpbiUgYWxsX3N1cnZleXNbMjE6MzRdICYgeWVhciA+IDE5NzldKSArCiAgbGFicyh4ID0gIk1pbmltdW0gYm90dG9tIHRlbXBlcmF0dXJlICjLmkMpIiwgIHkgPSAizrItZGl2ZXJzaXR5IikgKwogIGdlb21fcG9pbnQoYWVzKHggPSBhcy5udW1lcmljKHllYXJseV9taW5fYnlwb2ludF9hdmcpLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpLCBhbHBoYSA9IDAuMykgKwogIGdlb21fc21vb3RoKGFlcyh4ID0gYXMubnVtZXJpYyh5ZWFybHlfbWluX2J5cG9pbnRfYXZnKSwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgbWV0aG9kID0gImxtIikgKwogIGZhY2V0X3dyYXAoflN1cnZleV9OYW1lX1NlYXNvbiwgc2NhbGVzPSAiZnJlZSIsIG5jb2wgPSA0KSArCiAgdGhlbWVfY2xhc3NpYygpKQoKZ2dzYXZlKHByZWRzX3NidF9taW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMjFfMzQsIHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiksIGZpbGVuYW1lID0gInByZWRzX3NidF9taW5fdGVtcF9zdXJ2ZXlfZmFjZXRfMjFfMzQuanBnIiwgaGVpZ2h0ID0gMTIsIHdpZHRoID05KQoKIyMjIyMjI0ZJU0hJTkcKCmRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkLmNjIDwtIGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkW2NvbXBsZXRlLmNhc2VzKGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkWyxzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZ10pLF0KCihwcmVkc19zYnRfbWVhbl9maXNoaW5nX3N1cnZleV9mYWNldF8xXzIwIDwtIGdncGxvdChkYXRhID0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmQuY2Nbc3VydmV5X3VuaXQgJWluJSBhbGxfc3VydmV5c1sxOjIwXSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeCA9ICJSZWxhdGl2ZSBmaXNoaW5nIGNhdGNoIiwgIHkgPSAizrItZGl2ZXJzaXR5IikgKwogIGdlb21fcG9pbnQoYWVzKHggPSBzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZywgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeCA9IHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpLCBtZXRob2QgPSAibG0iKSArCiAgZmFjZXRfd3JhcCh+U3VydmV5X05hbWVfU2Vhc29uLCBzY2FsZXM9ICJmcmVlIiwgbmNvbCA9IDQpICsKICB0aGVtZV9jbGFzc2ljKCkpCgpnZ3NhdmUocHJlZHNfc2J0X21lYW5fZmlzaGluZ19zdXJ2ZXlfZmFjZXRfMV8yMCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAicHJlZHNfc2J0X21lYW5fZmlzaGluZ19zdXJ2ZXlfZmFjZXRfMV8yMC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgoocHJlZHNfc2J0X21lYW5fZmlzaGluZ19zdXJ2ZXlfZmFjZXRfMjFfMzQgPC0gZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZC5jY1tzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzW2MoMjE6MzQpXSAmIHllYXIgPiAxOTc5XSkgKwogIGxhYnMoeCA9ICJSZWxhdGl2ZSBmaXNoaW5nIGNhdGNoIiwgIHkgPSAizrItZGl2ZXJzaXR5IikgKwogIGdlb21fcG9pbnQoYWVzKHggPSBzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZywgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3Ntb290aChhZXMoeCA9IHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpLCBtZXRob2QgPSAibG0iKSArCiAgZmFjZXRfd3JhcCh+U3VydmV5X05hbWVfU2Vhc29uLCBzY2FsZXM9ICJmcmVlIiwgbmNvbCA9IDQpICsKICB0aGVtZV9jbGFzc2ljKCkpCgpnZ3NhdmUocHJlZHNfc2J0X21lYW5fZmlzaGluZ19zdXJ2ZXlfZmFjZXRfMjFfMzQsIHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiksIGZpbGVuYW1lID0gInByZWRzX3NidF9tZWFuX2Zpc2hpbmdfc3VydmV5X2ZhY2V0XzIxXzM0LmpwZyIsIGhlaWdodCA9IDEyLCB3aWR0aCA9OSkKCgpgYGAKCiMjI1Bsb3QgbnVtYmVyIG9mIHRvd3MgcGVyIHllYXIgcGVyIHJlZ2lvbgpgYGB7cn0KdG93c195ZWFyIDwtIHVuaXF1ZShkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFssLihzdXJ2ZXlfdW5pdCwgaGF1bF9pZF9jb3VudF9hbm51YWwsIGFyZWFfa20sIHllYXIsIFN1cnZleV9OYW1lX1NlYXNvbildKQoKbWluX2hhdWxfZGVuc2l0eSA8LSBtaW4odG93c195ZWFyJGhhdWxfaWRfY291bnRfYW5udWFsL3Rvd3NfeWVhciRhcmVhX2ttKQptYXhfaGF1bF9kZW5zaXR5IDwtIG1heCh0b3dzX3llYXIkaGF1bF9pZF9jb3VudF9hbm51YWwvdG93c195ZWFyJGFyZWFfa20pCgoodG93X2RlbnNpdHlfc3VydmV5X2ZhY2V0XzFfMjAgPC0gZ2dwbG90KGRhdGEgPSB0b3dzX3llYXJbc3VydmV5X3VuaXQgJWluJSBhbGxfc3VydmV5c1sxOjIwXV0pICsKICBsYWJzKHggPSAiWWVhciIsICB5ID0gZXhwcmVzc2lvbigiVG93IGRlbnNpdHkgKHRvd3MgcGVyIGttIl4yKiIpIikpICsKICBnZW9tX3BvaW50KGFlcyh4ID0geWVhciwgeSA9IGhhdWxfaWRfY291bnRfYW5udWFsL2FyZWFfa20pKSArCiAgeWxpbShjKG1pbl9oYXVsX2RlbnNpdHktMC4wMDAxLCBtYXhfaGF1bF9kZW5zaXR5KzAuMDAwMSkpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIG5jb2wgPSA0KSArCiAgdGhlbWVfY2xhc3NpYygpKQoKZ2dzYXZlKHRvd19kZW5zaXR5X3N1cnZleV9mYWNldF8xXzIwLCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLCBmaWxlbmFtZSA9ICJ0b3dfZGVuc2l0eV9zdXJ2ZXlfZmFjZXRfMV8yMC5qcGciLCBoZWlnaHQgPSAxMiwgd2lkdGggPTkpCgoodG93X2RlbnNpdHlfc3VydmV5X2ZhY2V0XzIxXzM0IDwtIGdncGxvdChkYXRhID0gdG93c195ZWFyW3N1cnZleV91bml0ICVpbiUgYWxsX3N1cnZleXNbMjE6MzRdXSkgKwogIGxhYnMoeCA9ICJZZWFyIiwgIHkgPSBleHByZXNzaW9uKCJUb3cgZGVuc2l0eSAodG93cyBwZXIga20iXjIqIikiKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSB5ZWFyLCB5ID0gaGF1bF9pZF9jb3VudF9hbm51YWwvYXJlYV9rbSkpICsKICB5bGltKGMobWluX2hhdWxfZGVuc2l0eS0wLjAwMDEsIG1heF9oYXVsX2RlbnNpdHkrMC4wMDAxKSkgKwogIGZhY2V0X3dyYXAoflN1cnZleV9OYW1lX1NlYXNvbiwgbmNvbCA9IDQpICsKICB0aGVtZV9jbGFzc2ljKCkpCgpnZ3NhdmUodG93X2RlbnNpdHlfc3VydmV5X2ZhY2V0XzIxXzM0LCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLCBmaWxlbmFtZSA9ICJ0b3dfZGVuc2l0eV9zdXJ2ZXlfZmFjZXRfMjFfMzQuanBnIiwgaGVpZ2h0ID0gMTIsIHdpZHRoID05KQoKI21pbmltdW0gYW5kIG1heGltdW0gZGlzc2ltaWxhcml0eSB2YWx1ZQptaW5fZGlzc2ltaWxhcml0eSA8LSBtaW4oZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmQkYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpCm1heF9kaXNzaW1pbGFyaXR5IDwtIG1heChkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZCRhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSkKCiNob3cgZG9lcyB0b3cgZGVuc2l0eSB2YXJ5IHdpdGggZGlzc2ltaWxhcml0eT8KdG93X2RlbnNpdHlfZGlzc2ltaWxhcml0eV8xXzIwIDwtIAogIGdncGxvdChkYXRhID0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmRbZGlzc2ltaWxhcml0eV9tZXRyaWMgPT0gImphY2NhcmRfZGlzc2ltaWxhcml0eV9pbmRleF9iaW5hcnkiICYgc3VydmV5X3VuaXQgJWluJSBhbGxfc3VydmV5c1sxOjIwXV0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gKGhhdWxfaWRfY291bnRfYW5udWFsL2FyZWFfa20pLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUsIGNvbG9yID0geWVhciksIHNpemUgPSAyKSArCiAgdmlyaWRpczo6c2NhbGVfY29sb3JfdmlyaWRpcygpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIG5jb2wgPSA0LCBzY2FsZXMgPSAiZnJlZSIpICsKICBsYWJzKHggPSBleHByZXNzaW9uKCJUb3cgZGVuc2l0eSAodG93cyBwZXIga20iXjIqIikiKSwgeSA9ICLOsi1kaXZlcnNpdHkiLCBjb2xvciA9ICJZZWFyIikgKwogICAjIHhsaW0oYyhtaW5faGF1bF9kZW5zaXR5LTAuMDAwMSwgbWF4X2hhdWxfZGVuc2l0eSswLjAwMDEpKSArCiAgICMgeWxpbShjKG1pbl9kaXNzaW1pbGFyaXR5LTAuMDEsbWF4X2Rpc3NpbWlsYXJpdHkrMC4wMSkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdCA9IDEpKQoKZ2dzYXZlKHRvd19kZW5zaXR5X2Rpc3NpbWlsYXJpdHlfMV8yMCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAidG93X2RlbnNpdHlfZGlzc2ltaWxhcml0eV8xXzIwLmpwZyIsIGhlaWdodCA9IDEyLCB3aWR0aCA9OSkKCnRvd19kZW5zaXR5X2Rpc3NpbWlsYXJpdHlfMjFfMzQgPC0gCiAgZ2dwbG90KGRhdGEgPSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFtkaXNzaW1pbGFyaXR5X21ldHJpYyA9PSAiamFjY2FyZF9kaXNzaW1pbGFyaXR5X2luZGV4X2JpbmFyeSIgJiBzdXJ2ZXlfdW5pdCAlaW4lIGFsbF9zdXJ2ZXlzWzIxOjM0XV0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gKGhhdWxfaWRfY291bnRfYW5udWFsL2FyZWFfa20pLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUsIGNvbG9yID0geWVhciksIHNpemUgPSAyKSArCiAgdmlyaWRpczo6c2NhbGVfY29sb3JfdmlyaWRpcygpICsKICBmYWNldF93cmFwKH5TdXJ2ZXlfTmFtZV9TZWFzb24sIG5jb2wgPSA0LCBzY2FsZXMgPSAiZnJlZSIpICsKICBsYWJzKHggPSBleHByZXNzaW9uKCJUb3cgZGVuc2l0eSAodG93cyBwZXIga20iXjIqIikiKSwgeSA9ICLOsi1kaXZlcnNpdHkiLCBjb2xvciA9ICJZZWFyIikgKwogICAjIHhsaW0oYyhtaW5faGF1bF9kZW5zaXR5LTAuMDAwMSwgbWF4X2hhdWxfZGVuc2l0eSswLjAwMDEpKSArCiAgICMgeWxpbShjKG1pbl9kaXNzaW1pbGFyaXR5LTAuMDEsbWF4X2Rpc3NpbWlsYXJpdHkrMC4wMSkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdCA9IDEpKQoKZ2dzYXZlKHRvd19kZW5zaXR5X2Rpc3NpbWlsYXJpdHlfMjFfMzQsIHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiksIGZpbGVuYW1lID0gInRvd19kZW5zaXR5X2Rpc3NpbWlsYXJpdHlfMjFfMzQuanBnIiwgaGVpZ2h0ID0gMTIsIHdpZHRoID05KQoKCiNQbG90IGFsbCBhdCBvbmNlPwp0b3dfZGVuc2l0eV9kaXNzaW1pbGFyaXR5IDwtIAogIGdncGxvdChkYXRhID0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmRbZGlzc2ltaWxhcml0eV9tZXRyaWMgPT0gImphY2NhcmRfZGlzc2ltaWxhcml0eV9pbmRleF9iaW5hcnkiXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSAoaGF1bF9pZF9jb3VudF9hbm51YWwvYXJlYV9rbSksIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSwgY29sb3IgPSBTdXJ2ZXlfTmFtZV9TZWFzb24pLCBzaXplID0gMikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9saW5rJGhleCkgKwogIGxhYnMoeCA9IGV4cHJlc3Npb24oIlRvdyBkZW5zaXR5ICh0b3dzIHBlciBrbSJeMioiKSIpLCB5ID0gIs6yLWRpdmVyc2l0eSIsIGNvbG9yID0gIlllYXIiKSArCiAgICMgeGxpbShjKG1pbl9oYXVsX2RlbnNpdHktMC4wMDAxLCBtYXhfaGF1bF9kZW5zaXR5KzAuMDAwMSkpICsKICAgIyB5bGltKGMobWluX2Rpc3NpbWlsYXJpdHktMC4wMSxtYXhfZGlzc2ltaWxhcml0eSswLjAxKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKI2FuZCBieSBudW1iZXJzPwpyZXN1bHQgPC0gZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmRbLCAuKG1heF9kZW5zaXR5ID0gbWF4KGhhdWxfaWRfY291bnRfYW5udWFsL2FyZWFfa20sIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICAgICAgIG1pbl9kZW5zaXR5ID0gbWluKGhhdWxfaWRfY291bnRfYW5udWFsL2FyZWFfa20sIG5hLnJtID0gVFJVRSkpLCAKICAgICAgICAgICAgIGJ5ID0gU3VydmV5X05hbWVfU2Vhc29uXQoKcmVzdWx0WyxyYW5nZTo9IG1heF9kZW5zaXR5LW1pbl9kZW5zaXR5XQoKZ2dwbG90KGRhdGEgPSByZXN1bHQpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gU3VydmV5X05hbWVfU2Vhc29uLCB5ID0gcmFuZ2UpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHggPSAiIix5ID0gIlJhbmdlIG9mIHRvdyBkZW5zaXR5IHZhbHVlcyBpbiB0b3cva21eMiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSkKCmBgYAoKUGxvdCBkaXNzaW1pbGFyaXR5IGJ5IHNlYXNvbiBvZiBzYW1wbGluZwpgYGB7cn0KZGlzc2ltaWxhcml0aWVzX3RlbXBfZmlzaGluZ19hcmVhLmphY2NhcmRbLHNlYXNvbiA6PSBmYWN0b3Ioc2Vhc29uLCBsZXZlbHMgPSBjKCJTcHJpbmciLCJTdW1tZXIiLCJGYWxsIiwiV2ludGVyIikpXQoKZ2dwbG90KGRpc3NpbWlsYXJpdGllc190ZW1wX2Zpc2hpbmdfYXJlYS5qYWNjYXJkKSArCiAgZ2VvbV9ib3hwbG90KGFlcyh4ID0gc2Vhc29uLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAoKCgojIyNTZXQgdXAgZHJlZGdlIHRvIGlkZW50aWZ5IGJlc3QgcGVyZm9ybWluZyBtb2RlbHMKCkZpcnN0LCBtYWtlIGRhdGEgdGFibGUgb2YgbW9kZWwgY292YXJpYXRlcwpgYGB7cn0KCm9wdGlvbnMobmEuYWN0aW9uID0gIm5hLmZhaWwiKQoKZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCA8LSBkaXNzaW1pbGFyaXRpZXNfdGVtcF9maXNoaW5nX2FyZWEuamFjY2FyZFssLgogICAgICAgICAgICAgICAgICAoeWVhciwgc3VydmV5X3VuaXQsCiAgICAgICAgICAgICAgICAgICAgeWVhcmx5X21lYW5fYnlwb2ludF9hdmcsIHllYXJseV9tYXhfYnlwb2ludF9hdmcsIHllYXJseV9taW5fYnlwb2ludF9hdmcseWVhcmx5X3NlYXNfYnlwb2ludF9hdmcsCiAgICAgICAgICAgICAgICAgICAgeWVhcmx5X21lYW5fYnlwb2ludF9TRCwgeWVhcmx5X21heF9ieXBvaW50X1NELCB5ZWFybHlfbWluX2J5cG9pbnRfU0QseWVhcmx5X3NlYXNfYnlwb2ludF9TRCwKICAgICAgICAgICAgICAgICAgICB5ZWFybHlfbWVhbl9ieXBvaW50X2F2Zy5zLCB5ZWFybHlfbWF4X2J5cG9pbnRfYXZnLnMsIHllYXJseV9taW5fYnlwb2ludF9hdmcucyx5ZWFybHlfc2Vhc19ieXBvaW50X2F2Zy5zLAogICAgICAgICAgICAgICAgICAgIGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlLAogICAgICAgICAgICAgICAgICAgIGhhdWxfaWRfY291bnRfYW5udWFsLAogICAgICAgICAgICAgICAgICAgIHNwcF9jb3VudF9hbm51YWwsIGRlcHRoX2FubnVhbF9hdmcsCiAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX3JhbmdlLCBsYXRpdHVkZV9hbm51YWxfYXZnLAogICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9yYW5nZSwgYXJlYV9rbSwgc2Vhc29uLCBzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZyldCgojbWVyZ2UgaW4gd2l0aCBjb2xvcnMgZm9yIHBsb3R0aW5nIHByZWRpY3Rpb25zIGJ5IHN1cnZleQpkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0IDwtIGNvbG9yX2xpbmtbZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCwgb24gPSAic3VydmV5X3VuaXQiXQoKI0lmIE5BIGZvciBhbnkgY292YXJpYXRlLCBkZWxldGUgcm93CiNWaWV3KGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpCiNEZWxldGVkOgogICNCZWZvcmUgMTk4MCBhbmQgYWZ0ZXIgMjAxOQogICNHdWxmIG9mIFNhaW50IExhdXJlbmNlIFNvdXRoIChubyBkZXB0aCBkYXRhKQogICNObyBjbGVhciBTQVUgbWF0Y2ggZm9yIFJvY2thbGwgUGxhdGVhdQpkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0IDwtIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRbY29tcGxldGUuY2FzZXMoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCldCgojU2NhbGUgYW5kIGNlbnRlciB2YXJpYWJsZXMgdGhhdCBhcmUgbm90IHlldCBzY2FsZWQgYW5kIGNlbnRlcmVkCmRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRbLCB5ZWFybHlfbWVhbl9ieXBvaW50X2F2Zy5zY2FsZWRhY3Jvc3NhbGwgOj0gc2NhbGUoeWVhcmx5X21lYW5fYnlwb2ludF9hdmcpXVssIHllYXJseV9tZWFuX2J5cG9pbnRfU0Quc2NhbGVkYWNyb3NzYWxsIDo9IHNjYWxlKHllYXJseV9tZWFuX2J5cG9pbnRfU0QpXVssIHllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsIDo9IHNjYWxlKHllYXJseV9taW5fYnlwb2ludF9hdmcpXVssIHllYXJseV9tYXhfYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsIDo9IHNjYWxlKHllYXJseV9tYXhfYnlwb2ludF9hdmcpXVssIHllYXJseV9zZWFzX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbCA6PSBzY2FsZSh5ZWFybHlfc2Vhc19ieXBvaW50X2F2ZyldWyxoYXVsX2lkX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgOj0gc2NhbGUoaGF1bF9pZF9jb3VudF9hbm51YWwpXVssc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgOj0gc2NhbGUoc3BwX2NvdW50X2FubnVhbCldWyxkZXB0aF9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCA6PSBzY2FsZShkZXB0aF9hbm51YWxfYXZnKV1bLGRlcHRoX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgOj0gc2NhbGUoZGVwdGhfYW5udWFsX3JhbmdlKV0gWyxsYXRpdHVkZV9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCA6PSBzY2FsZShsYXRpdHVkZV9hbm51YWxfYXZnKV1bLGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgOj0gc2NhbGUobGF0aXR1ZGVfYW5udWFsX3JhbmdlKV1bLGFyZWFfa20uc2NhbGVkYWNyb3NzYWxsIDo9IHNjYWxlKGFyZWFfa20pXQoKCmBgYAoKIyMjI0dsb2JhbCBtb2RlbCBjb250ZW5kZXJzCn4gdGVtcCAqIHN1cnZleV91bml0ICsgZmlzaGluZyAqIHN1cnZleV91bml0ICsgYXJlYSArIGxhdGl0dWRlIHJhbmdlICsgbGF0aXR1ZGUgYXZlcmFnZSArIGRlcHRoIHJhbmdlICsgZGVwdGggYXZlcmFnZSArIHNwcCBjb3VudCArICMgb2YgaGF1bHMgKyBzZWFzb24gKyBBUiBmb3IgeWVhciAob3B0aW9uYWwsIHdpbGwgc2VlIGlmIHRoaXMgcGVyZm9ybXMgYmV0dGVyIG9yIHdvcnNlIHdpdGggQVIxKQoKRm9yIHRlbXBlcmF0dXJlLCB3ZSB3aWxsIGNvbXBhcmUgcGVyZm9ybWFuY2Ugb2Y6Ci1tZWFuIChzY2FsZWQgYWNyb3NzIGFsbCByZWdpb25zKQotbWF4ICAoc2NhbGVkIGFjcm9zcyBhbGwgcmVnaW9ucykKLW1pbiAoc2NhbGVkIGFjcm9zcyBhbGwgcmVnaW9ucykKLXNlYXMgIChzY2FsZWQgYWNyb3NzIGFsbCByZWdpb25zKQotU0QgKHNjYWxlZCBhY3Jvc3MgYWxsIHJlZ2lvbnMpCgpDb21wYXJpbmcgdGVtcCB2YXJpYWJsZXMgQU5EIHRoZSBwcmVzZW5jZS9hYnNlbmNlIG9mIGEgdGVtcG9yYWwgYXV0b2NvcnJlbGF0aW9uIHRlcm0KYGBge3IgZml0IGdsb2JhbCBtb2R9CgojbWVhbiB0ZW1wZXJhdHVyZQpnbG9iYWxfbW9kX21lYW5fdGVtcF9sbSA8LSBsbShhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnllYXJseV9tZWFuX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbCArICN0ZW1wIGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcgKyAjZmlzaGluZyBlZmZvcnQgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhX2ttLnNjYWxlZGFjcm9zc2FsbCArICNhcmVhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHBfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArICNzcHAgIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdWxfaWRfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0KQoKI3dpdGggdGVtcG9yYWwgYXV0b2NvcnJlbGF0aW9uCmdsb2JhbF9tb2RfbWVhbl90ZW1wX2dscyA8LSBnbHMoYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXlfdW5pdCp5ZWFybHlfbWVhbl9ieXBvaW50X2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjdGVtcCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnICsgI2Zpc2hpbmcgZWZmb3J0IGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYV9rbS5zY2FsZWRhY3Jvc3NhbGwgKyAjYXJlYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKyAjc3BwICMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXVsX2lkX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMShmb3JtPX55ZWFyIHwgc3VydmV5X3VuaXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0KQojbWF4aW11bSB0ZW1wZXJhdHVyZQpnbG9iYWxfbW9kX21heF90ZW1wX2xtIDwtIGxtKGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqeWVhcmx5X21heF9ieXBvaW50X2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjdGVtcCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnICsgI2Zpc2hpbmcgZWZmb3J0IGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYV9rbS5zY2FsZWRhY3Jvc3NhbGwgKyAjYXJlYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKyAjc3BwICMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXVsX2lkX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0KQoKI3dpdGggdGVtcG9yYWwgYXV0b2NvcnJlbGF0aW9uCmdsb2JhbF9tb2RfbWF4X3RlbXBfZ2xzIDwtZ2xzKGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqeWVhcmx5X21heF9ieXBvaW50X2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjdGVtcCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnICsgI2Zpc2hpbmcgZWZmb3J0IGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYV9rbS5zY2FsZWRhY3Jvc3NhbGwgKyAjYXJlYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKyAjc3BwICMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXVsX2lkX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoZm9ybT1+eWVhciB8IHN1cnZleV91bml0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKI21pbmltdW0gdGVtcGVyYXR1cmUKZ2xvYmFsX21vZF9taW5fdGVtcF9sbSA8LSBsbShhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI3RlbXAgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXlfdW5pdCpzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZyArICNmaXNoaW5nIGVmZm9ydCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFfa20uc2NhbGVkYWNyb3NzYWxsICsgI2FyZWEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsICsgI3NwcCAjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF1bF9pZF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKCmRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRbLCBzdXJ2ZXlfdW5pdCA6PSBmYWN0b3Ioc3VydmV5X3VuaXQsIGxldmVscyA9IHNvcnQoYWxsX3N1cnZleXMpKV0KCiN3aXRoIHRlbXBvcmFsIGF1dG9jb3JyZWxhdGlvbgpnbG9iYWxfbW9kX21pbl90ZW1wX2dscyA8LWdscyhhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI3RlbXAgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXlfdW5pdCpzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZyArICNmaXNoaW5nIGVmZm9ydCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFfa20uc2NhbGVkYWNyb3NzYWxsICsgI2FyZWEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsICsgI3NwcCAjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF1bF9pZF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKGZvcm09fnllYXIgfCBzdXJ2ZXlfdW5pdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpCgojdGVtcGVyYXR1cmUgc2Vhc29uYWxpdHkKZ2xvYmFsX21vZF9zZWFzX3RlbXBfbG0gPC0gbG0oYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXlfdW5pdCp5ZWFybHlfc2Vhc19ieXBvaW50X2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjdGVtcCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnICsgI2Zpc2hpbmcgZWZmb3J0IGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYV9rbS5zY2FsZWRhY3Jvc3NhbGwgKyAjYXJlYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKyAjc3BwICMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXVsX2lkX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKCiN3aXRoIHRlbXBvcmFsIGF1dG9jb3JyZWxhdGlvbgpnbG9iYWxfbW9kX3NlYXNfdGVtcF9nbHMgPC0gZ2xzKGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqeWVhcmx5X3NlYXNfYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI3RlbXAgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXlfdW5pdCpzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZyArICNmaXNoaW5nIGVmZm9ydCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFfa20uc2NhbGVkYWNyb3NzYWxsICsgI2FyZWEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsICsgI3NwcCAjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF1bF9pZF9jb3VudF9hbm51YWwuc2NhbGVkYWNyb3NzYWxsICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoZm9ybT1+eWVhciB8IHN1cnZleV91bml0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKCiNzdGFuZGFyZCBkZXZpYXRpb24KZ2xvYmFsX21vZF9TRF90ZW1wX2xtIDwtIGxtKGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqeWVhcmx5X21lYW5fYnlwb2ludF9TRC5zY2FsZWRhY3Jvc3NhbGwgKyAjdGVtcCBhbmQgc3VydmV5IHVuaXQgKHBvc3NpYmxlIGludGVyYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleV91bml0KnN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnICsgI2Zpc2hpbmcgZWZmb3J0IGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYV9rbS5zY2FsZWRhY3Jvc3NhbGwgKyAjYXJlYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjbGF0aXR1ZGUgcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZV9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfcmFuZ2Uuc2NhbGVkYWNyb3NzYWxsICsgI2RlcHRoIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggYXZnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BwX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKyAjc3BwICMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXVsX2lkX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHQpCgojd2l0aCB0ZW1wb3JhbCBhdXRvY29ycmVsYXRpb24KZ2xvYmFsX21vZF9TRF90ZW1wX2dscyA8LSBnbHMoYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXlfdW5pdCp5ZWFybHlfbWVhbl9ieXBvaW50X1NELnNjYWxlZGFjcm9zc2FsbCArICN0ZW1wIGFuZCBzdXJ2ZXkgdW5pdCAocG9zc2libGUgaW50ZXJhY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQqc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcgKyAjZmlzaGluZyBlZmZvcnQgYW5kIHN1cnZleSB1bml0IChwb3NzaWJsZSBpbnRlcmFjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhX2ttLnNjYWxlZGFjcm9zc2FsbCArICNhcmVhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCArICNsYXRpdHVkZSByYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlX2FubnVhbF9hdmcuc2NhbGVkYWNyb3NzYWxsICsgI2xhdGl0dWRlIGF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoX2FubnVhbF9yYW5nZS5zY2FsZWRhY3Jvc3NhbGwgKyAjZGVwdGggcmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9hbm51YWxfYXZnLnNjYWxlZGFjcm9zc2FsbCArICNkZXB0aCBhdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHBfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArICNzcHAgIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdWxfaWRfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoZm9ybT1+eWVhciB8IHN1cnZleV91bml0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKCiNDb21wYXJlIEFJQ2NzClZpZXcoQUlDYyhnbG9iYWxfbW9kX21lYW5fdGVtcF9sbSwgZ2xvYmFsX21vZF9tYXhfdGVtcF9sbSwgZ2xvYmFsX21vZF9taW5fdGVtcF9sbSwgZ2xvYmFsX21vZF9zZWFzX3RlbXBfbG0sIGdsb2JhbF9tb2RfU0RfdGVtcF9sbSwKICAgICAgICAgIGdsb2JhbF9tb2RfbWVhbl90ZW1wX2dscywgZ2xvYmFsX21vZF9tYXhfdGVtcF9nbHMsIGdsb2JhbF9tb2RfbWluX3RlbXBfZ2xzLCBnbG9iYWxfbW9kX3NlYXNfdGVtcF9nbHMsIGdsb2JhbF9tb2RfU0RfdGVtcF9nbHMpKQoKI2J1aWxkIGRhdGEgdGFibGUgdG8gcmVwb3J0IEFJQ2MKZ2xvYmFsX21vZF90ZW1wX3RhYmxlIDwtIGRhdGEudGFibGUoCiAgYFRlbXBvcmFsIGF1dG9jb3JyZWxhdGlvbmAgPSBjKAogICAgYyhyZXAoRiw1KSxyZXAoVCw1KSkKICApLAogIGBUZW1wZXJhdHVyZSB2YXJpYWJsZWAgPSByZXAoYyggICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAiQXZlcmFnZSBtZWFuIFNCVCIsCiAgICAgICAgICAgICAgIkF2ZXJhZ2UgbWF4aW11bSBTQlQiLCAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICJBdmVyYWdlIG1pbmltdW0gU0JUIiwgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAiQXZlcmFnZSBTQlQgc2Vhc29uYWxpdHkiLCAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIlNCVCBTRCIpLDIpLAogIGRlbHRhQUlDYyA9IHNpZ25pZihtaW4oQUlDYyhnbG9iYWxfbW9kX21lYW5fdGVtcF9sbSwgZ2xvYmFsX21vZF9tYXhfdGVtcF9sbSwgZ2xvYmFsX21vZF9taW5fdGVtcF9sbSwgZ2xvYmFsX21vZF9zZWFzX3RlbXBfbG0sIGdsb2JhbF9tb2RfU0RfdGVtcF9sbSwKICAgICAgICAgIGdsb2JhbF9tb2RfbWVhbl90ZW1wX2dscywgZ2xvYmFsX21vZF9tYXhfdGVtcF9nbHMsIGdsb2JhbF9tb2RfbWluX3RlbXBfZ2xzLCBnbG9iYWxfbW9kX3NlYXNfdGVtcF9nbHMsIGdsb2JhbF9tb2RfU0RfdGVtcF9nbHMpWywyXSktQUlDYyhnbG9iYWxfbW9kX21lYW5fdGVtcF9sbSwgZ2xvYmFsX21vZF9tYXhfdGVtcF9sbSwgZ2xvYmFsX21vZF9taW5fdGVtcF9sbSwgZ2xvYmFsX21vZF9zZWFzX3RlbXBfbG0sIGdsb2JhbF9tb2RfU0RfdGVtcF9sbSwKICAgICAgICAgIGdsb2JhbF9tb2RfbWVhbl90ZW1wX2dscywgZ2xvYmFsX21vZF9tYXhfdGVtcF9nbHMsIGdsb2JhbF9tb2RfbWluX3RlbXBfZ2xzLCBnbG9iYWxfbW9kX3NlYXNfdGVtcF9nbHMsIGdsb2JhbF9tb2RfU0RfdGVtcF9nbHMpWywyXSwyKSkKCiNvcmRlciBieSBhaWNjCnNldG9yZGVyKGdsb2JhbF9tb2RfdGVtcF90YWJsZSxjb2xzID0gLSJkZWx0YUFJQ2MiKQoKZ2xvYmFsX21vZF90ZW1wX3RhYmxlWyxSYW5rIDo9IHNlcSgxLDEwLGJ5ID0gMSldCgpnbG9iYWxfbW9kX3NidF90YWJsZSA8LSBnbG9iYWxfbW9kX3RlbXBfdGFibGVbLC4oUmFuayxgVGVtcG9yYWwgYXV0b2NvcnJlbGF0aW9uYCxgVGVtcGVyYXR1cmUgdmFyaWFibGVgLCBkZWx0YUFJQ2MpXQoKZndyaXRlKGdsb2JhbF9tb2Rfc2J0X3RhYmxlLCBoZXJlOjpoZXJlKCJvdXRwdXQiLCJnbG9iYWxfbW9kX3NidF90YWJsZS5jc3YiKSkKCmBgYAoKIyMjI0Jlc3QgcGVyZm9ybWluZyBnbG9iYWwgbW9kZWwgaW5jbHVkZXMgbWluaW11bSB0ZW1wZXJhdHVyZSAoY2VudGVyZWQgYW5kIHNjYWxlZCkgKFN0aWxsIHRoZSBjYXNlIGFzIG9mIEp1bHkgMTcsIDIwMjQpCgpOb3csIGxvb2sgYXQgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBhbGwgcHJlZGljdG9ycyAobWluIHRlbXApIHVzaW5nIGRyZWRnZQoKR2xvYmFsIG1vZGVsOiBnbG9iYWxfbW9kX21pbl90ZW1wCgpgYGB7cn0Kb3B0aW9ucyhuYS5hY3Rpb24gPSAibmEuZmFpbCIpICMgIHByZXZlbnQgZml0dGluZyBzdWItbW9kZWxzIHRvIGRpZmZlcmVudCBkYXRhc2V0cwpkZCA8LSBkcmVkZ2UoZ2xvYmFsX21vZF9taW5fdGVtcF9sbSkKZGQuZHQgPC0gZGF0YS50YWJsZShkZCkKVmlldyhkZCkKCiNvbmx5IG1vZGVscyBsZXNzIHRoYW4gMiBkZWx0YSBBSUNjICgyIG1vZGVscykKZGQuZHQuMiA8LSBkZC5kdFtkZWx0YSA8PSAyLF0KCmNvbG5hbWVzKGRkLmR0LjIpCgojaW4gdGhpcyBzdGVwLCB3ZSBkZWxldGUgY29lZmZpY2llbnQgdmFsdWVzIGJlY2F1c2Ugd2Ugd2lsbCBwdWxsIHRoZW0gYmFjayBpbiBsYXRlciB3aGVuIHdlIGNhbGN1bGF0ZSBib3RoIFNFIGFuZCBjb2VmZmljaWVudHMgKG90aGVyIHRoYW4gaW50ZXJhY3Rpb24sIHdoaWNoIHdlIGtlZXAgaGVyZSkKZGQuZHQuMi5mb3JtYXR0ZWQgPC0gZGQuZHQuMlssUmFuayA6PSBhcy5udW1lcmljKHJvd25hbWVzKGRkLmR0LjIpKV1bLC4oUmFuaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWc6c3VydmV5X3VuaXRgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBzdXJ2ZXlfdW5pdDp5ZWFybHlfbWluX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbGAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0LCBzdXJ2ZXlfdW5pdCwgc2Vhc29uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKV0KCiNhZGQgci1zcXVhcmVkIHZhbHVlcwojIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYmVzdCBtb2RlbHMgYW5kIGV4dHJhY3QgUi1zcXVhcmVkIHZhbHVlcwpyX3NxdWFyZWRfdmFsdWVzIDwtbGlzdCgpCmZvciAoaSBpbiAxOm5yb3coZGQuZHQuMi5mb3JtYXR0ZWQpKSB7CiAgc3VtbWFyeV9kYXRhIDwtIHN1bW1hcnkoZ2V0Lm1vZGVscyhkZCwgc3Vic2V0ID0gaSlbWzFdXSkKICByX3NxdWFyZWQgPC0gc2lnbmlmKHN1bW1hcnlfZGF0YSRyLnNxdWFyZWQsMikKICByX3NxdWFyZWRfdmFsdWVzIDwtIHVubGlzdChjKHJfc3F1YXJlZF92YWx1ZXMscl9zcXVhcmVkKSkKfQoKZGQuZHQuMi5mb3JtYXR0ZWRbLCJSIHNxdWFyZWQiIDo9IHJfc3F1YXJlZF92YWx1ZXNdCgojZW1wdHkgZGF0YSB0YWJsZQoKbW9kZWxfY29lZl9zZV9maWxsIDwtIGRhdGEudGFibGUoUmFuayA9IGFzLm51bWVyaWMoKSwgY29lZl9uYW1lID0gYXMuY2hhcmFjdGVyKCksY29lZiA9IGFzLm51bWVyaWMoKSwgc2UgPSBhcy5udW1lcmljKCkpCgpmb3IgKGkgaW4gMTpucm93KGRkLmR0LjIuZm9ybWF0dGVkKSl7CiAgbW9kZWxfY29lZl9zZV9zaW5nbGUgPC0gZGF0YS50YWJsZSh1bmxpc3QoY29lZlRhYmxlKGRkLGZ1bGwgPSBUKVtbaV1dKSkKICBtb2RlbF9jb2VmX3NlX3NpbmdsZVssY29lZl9uYW1lcyA6PSByb3duYW1lcyh1bmxpc3QoY29lZlRhYmxlKGRkLGZ1bGwgPSBUKVtbaV1dKSldCiAgbW9kZWxfY29lZl9zZV9zaW5nbGVbLFJhbmsgOj0gaV0KICAKICBjb2xuYW1lcyhtb2RlbF9jb2VmX3NlX3NpbmdsZSkgPC0gYygiY29lZiIsInNlIiwiZGYiLCJjb2VmX25hbWUiLCJSYW5rIikKICAKICAjcmVkdWNlIHRvIGNvbHVtbnMgd2UgbmVlZAogIG1vZGVsX2NvZWZfc2Vfc2luZ2xlIDwtIG1vZGVsX2NvZWZfc2Vfc2luZ2xlWywuKFJhbmssIGNvZWZfbmFtZSwgY29lZiwgc2UpXQogIAogIG1vZGVsX2NvZWZfc2VfZmlsbCA8LSByYmluZChtb2RlbF9jb2VmX3NlX2ZpbGwsbW9kZWxfY29lZl9zZV9zaW5nbGUpCn0KCiNmb3JtYXQgdG8gbWVyZ2Ugd2l0aCBtb2RlbCByYW5raW5ncyBhbmQgYXZlcmFnZWQgbW9kZWwKbW9kZWxfY29lZl9zZV9maWxsWyxjb2VmX3NlIDo9IHBhc3RlMChyb3VuZChjb2VmLDMpLCIgwrEgIixyb3VuZChzZSwzKSldCgojZGVsZXRlIGV4dHJhIGNvbHVtbnMKbW9kZWxfY29lZl9zZV9maWxsIDwtIG1vZGVsX2NvZWZfc2VfZmlsbFssLihSYW5rLGNvZWZfbmFtZSxjb2VmX3NlKV0KCiNsb25nIHRvIHdpZGUKbW9kZWxfY29lZl9zZV9maWxsLncgPC0gZGNhc3QobW9kZWxfY29lZl9zZV9maWxsLCBmb3JtdWxhID0gUmFuayB+IGNvZWZfbmFtZSwgdmFsdWUudmFyID0gYygiY29lZl9zZSIpKQoKI21lcmdlIG1vZGVsX2NvZWZfc2VfZmlsbCB3aXRoIGRkLmR0LjIuZm9ybWF0dGVkCm1vZGVsX2NvZWZfc2VfQUlDIDwtIGRkLmR0LjIuZm9ybWF0dGVkW21vZGVsX2NvZWZfc2VfZmlsbC53LCBvbiA9ICJSYW5rIl0KCiNtb2RlbCBhdmVyYWdlIGFsbCBtb2RlbHMgd2l0aCBkZWx0YSA8IDQgKDggbW9kZWxzKQptb2RlbF9hdmdfZGVsdGE0IDwtbW9kZWwuYXZnKGRkLCBzdWJzZXQgPSBkZWx0YSA8IDQsIGZpdCA9IFQpICNOQjogVGhlIOKAmHN1YnNldOKAmSAob3Ig4oCYY29uZGl0aW9uYWzigJkpIGF2ZXJhZ2Ugb25seSAgIGF2ZXJhZ2VzIG92ZXIgdGhlIG1vZGVscyB3aGVyZSB0aGUgcGFyYW1ldGVyIGFwcGVhcnMuIEFuIGFsdGVybmF0aXZlLCB0aGUg4oCYZnVsbOKAmSBhdmVyYWdlIGFzc3VtZXMgdGhhdCBhIHZhcmlhYmxlIGlzIGluY2x1ZGVkIGluIGV2ZXJ5IG1vZGVsLCBidXQgaW4gc29tZSBtb2RlbHMgdGhlIGNvcnJlc3BvbmRpbmcgY29lZmZpY2llbnQgKGFuZCBpdHMgcmVzcGVjdGl2ZSB2YXJpYW5jZSkgaXMgc2V0IHRvIHplcm8uIFVubGlrZSB0aGUg4oCYc3Vic2V0IGF2ZXJhZ2XigJksIGl0IGRvZXMgbm90IGhhdmUgYSB0ZW5kZW5jeSBvZiBiaWFzaW5nIHRoZSB2YWx1ZSBhd2F5IGZyb20gemVyby4gVGhlIOKAmGZ1bGzigJkgYXZlcmFnZSBpcyBhIHR5cGUgb2Ygc2hyaW5rYWdlIGVzdGltYXRvciwgYW5kIGZvciB2YXJpYWJsZXMgd2l0aCBhIHdlYWsgcmVsYXRpb25zaGlwIHRvIHRoZSByZXNwb25zZSBpdCBpcyBzbWFsbGVyIHRoYW4g4oCYc3Vic2V04oCZIGVzdGltYXRvcnMuLCBmaXQgPSBUIGZpdHMgdGhlIGNvbXBvbmVudCBtb2RlbHMgYWdhaW4KCm1vZGVsX2F2Z19ub3RlbXAgPC0gc3Vic2V0KG1vZGVsX3NldCwgISgic3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWciICVpbiUgYXR0cih0ZXJtcyhtb2RlbC5zZXQpLCAidGVybS5sYWJlbHMiKSkpCiAgCiNDYWxjdWxhdGUgbWFyZ2luYWwgUl4yIHZhbHVlcwoKIyA1LiBGaWx0ZXIgbW9kZWwgc2V0IHRvIGV4Y2x1ZGUgdGhlIHZhcmlhYmxlIG9mIGludGVyZXN0Cm1vZGVsX3NldF9taW51c19maXNoaW5nIDwtIHN1YnNldChkZCwgIWdyZXBsKCJzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZyIsIGZvcm11bGEpKQoKIyBHZXQgYWxsIG1vZGVscyBmcm9tIGRyZWRnZSBvdXRwdXQKYWxsX21vZGVscyA8LSBnZXQubW9kZWxzKGRkLCBzdWJzZXQgPSBUUlVFKQoKIyBGaWx0ZXIgb3V0IG9uZXMgdGhhdCBjb250YWluIHRoZSB0ZXJtCm1vZGVsc19taW51c19maXNoaW5nIDwtIEZpbHRlcihmdW5jdGlvbihtKSB7CiAgIWFueShncmVwbCgic3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWciLCBhdHRyKHRlcm1zKG0pLCAidGVybS5sYWJlbHMiKSkpCn0sIGFsbF9tb2RlbHMpCgptb2RlbF9zZWxlY3Rpb25fbWludXNfZmlzaGluZyA8LSBtb2RlbC5zZWwobW9kZWxzX21pbnVzX2Zpc2hpbmcpCgojQ2FsY3VsYXRlIFJeMiBubyBmaXNoaW5nCm5vZmlzaGluZ19zdW1tYXJ5IDwtIHN1bW1hcnkoZ2V0Lm1vZGVscyhtb2RlbF9zZWxlY3Rpb25fbWludXNfZmlzaGluZywgc3Vic2V0ID0gMSlbWzFdXSkgIzAuOTMKcjJfbm9maXNoaW5nIDwtIHNpZ25pZihub2Zpc2hpbmdfc3VtbWFyeSRyLnNxdWFyZWQpCnIyX25vZmlzaGluZyAKCiMgRmlsdGVyIG91dCBvbmVzIHRoYXQgY29udGFpbiB0aGUgdGVybQptb2RlbHNfbWludXNfdGVtcGVyYXR1cmUgPC0gRmlsdGVyKGZ1bmN0aW9uKG0pIHsKICAhYW55KGdyZXBsKCJ5ZWFybHlfbWluX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbCIsIGF0dHIodGVybXMobSksICJ0ZXJtLmxhYmVscyIpKSkKfSwgYWxsX21vZGVscykKCm1vZGVsX3NlbGVjdGlvbl9taW51c190ZW1wZXJhdHVyZSA8LSBtb2RlbC5zZWwobW9kZWxzX21pbnVzX3RlbXBlcmF0dXJlKQoKI0NhbGN1bGF0ZSBSXjIgbm8gdGVtcGVyYXR1cmUKbm90ZW1wZXJhdHVyZV9zdW1tYXJ5IDwtIHN1bW1hcnkoZ2V0Lm1vZGVscyhtb2RlbF9zZWxlY3Rpb25fbWludXNfdGVtcGVyYXR1cmUsIHN1YnNldCA9IDEpW1sxXV0pICMwLjk0CnIyX3RlbXBlcmF0dXJlIDwtIHNpZ25pZihub3RlbXBlcmF0dXJlX3N1bW1hcnkkci5zcXVhcmVkKQpyMl90ZW1wZXJhdHVyZQoKI0V4Y2x1ZGUgYm90aAptb2RlbHNfbWludXNfdGVtcF9hbmRfZmlzaGluZyA8LSBGaWx0ZXIoZnVuY3Rpb24obSkgewogIHRlcm1zIDwtIGF0dHIodGVybXMobSksICJ0ZXJtLmxhYmVscyIpCiAgIyBSZXR1cm4gVFJVRSBpZiBuZWl0aGVyIGZpc2hpbmcgbm9yIHRlbXAgKG9yIGludGVyYWN0aW9ucyBpbnZvbHZpbmcgdGhlbSkgYXJlIGluIHRlcm1zCiAgIWFueShncmVwbCgic3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWciLCB0ZXJtcykpICYmCiAgICAhYW55KGdyZXBsKCJ5ZWFybHlfbWluX2J5cG9pbnRfYXZnLnNjYWxlZGFjcm9zc2FsbCIsIHRlcm1zKSkKfSwgYWxsX21vZGVscykKCgptb2RlbF9zZWxlY3Rpb25fbWludXNfdGVtcF9hbmRfZmlzaGluZyA8LSBtb2RlbC5zZWwobW9kZWxzX21pbnVzX3RlbXBfYW5kX2Zpc2hpbmcpCgojQ2FsY3VsYXRlIFJeMiBubyBmaXNoaW5nCm5vdGVtcF9ub2Zpc2hpbmdfc3VtbWFyeSA8LSBzdW1tYXJ5KGdldC5tb2RlbHMobW9kZWxfc2VsZWN0aW9uX21pbnVzX3RlbXBfYW5kX2Zpc2hpbmcsIHN1YnNldCA9IDEpW1sxXV0pICMwLjkzCnIyX3RlbXBfYW5kX2Zpc2hpbmdfZXhjbHVkZSA8LSBzaWduaWYobm90ZW1wX25vZmlzaGluZ19zdW1tYXJ5JHIuc3F1YXJlZCkKcjJfdGVtcF9hbmRfZmlzaGluZ19leGNsdWRlCgoKCiNhZGQgU0UKbW9kZWxfYXZnX3ZhbHVlcyA8LSBhcy5kYXRhLnRhYmxlKGNvZWZUYWJsZShtb2RlbF9hdmdfZGVsdGE0LGZpbGwgPSBUKSkgIyB3aXRoIFNFCmNvZWZfbmFtZXMgPC0gbmFtZXMoY29lZihtb2RlbC5hdmcoZGQsIHN1YnNldCA9IGRlbHRhIDwgNCkpKQptb2RlbF9hdmdfdmFsdWVzWyxjb2VmX25hbWU6PWNvZWZfbmFtZXNdWyxjb2VmOj1Fc3RpbWF0ZV1bLEVzdGltYXRlOj1OVUxMXVssZGY6PU5VTExdWyxzZTo9IGBTdGQuIEVycm9yYF1bLGBTdGQuIEVycm9yYCA6PSBOVUxMXQoKI25ldyBjb2x1bW4gd2l0aCBjb2VmIGFuZCBTRQptb2RlbF9hdmdfdmFsdWVzWyxjb2VmX3NlIDo9IHBhc3RlMChyb3VuZChjb2VmLDMpLCIgwrEgIixyb3VuZChzZSwzKSldCgojbG9uZyB0byB3aWRlIGZvciBtb2RlbCBhdmcKbW9kZWxfYXZnLndpZGUgPC0gZGNhc3QobW9kZWxfYXZnX3ZhbHVlcywgZm9ybXVsYSA9IC4gfiBjb2VmX25hbWUsIHZhbHVlLnZhciA9IGMoImNvZWZfc2UiKSkKCiNhZGQgcmFuayBvZiAibW9kZWwgYXZnIiB0byB0YWJsZQptb2RlbF9hdmcud2lkZVssUmFuayA6PSAiTW9kZWwgYXZnIl0KCmJlc3RfbW9kZWxfc2J0X2phY2NhcmRfdGFibGVfZm9ybWF0dGVkIDwtIHJiaW5kKG1vZGVsX2NvZWZfc2VfQUlDLCBtb2RlbF9hdmcud2lkZSwgZmlsbCA9IFQpCgojZ2V0IHJpZCBvZiBpbnRlcmFjdGlvbiBjb2VmZmljaWVudHMKYmVzdF9tb2RlbF9zYnRfamFjY2FyZF90YWJsZV9mb3JtYXR0ZWQuciA8LSBiZXN0X21vZGVsX3NidF9qYWNjYXJkX3RhYmxlX2Zvcm1hdHRlZFssLihSYW5rLGAoSW50ZXJjZXB0KWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYV9rbS5zY2FsZWRhY3Jvc3NhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGhfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXVsX2lkX2NvdW50X2FubnVhbC5zY2FsZWRhY3Jvc3NhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX2F2Zy5zY2FsZWRhY3Jvc3NhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGVfYW5udWFsX3JhbmdlLnNjYWxlZGFjcm9zc2FsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHBfY291bnRfYW5udWFsLnNjYWxlZGFjcm9zc2FsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tZWRfdG9ubmVzX3NjYWxlZF9ieXJlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5X3VuaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhcmx5X21pbl9ieXBvaW50X2F2Zy5zY2FsZWRhY3Jvc3NhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnOnN1cnZleV91bml0YCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgc3VydmV5X3VuaXQ6eWVhcmx5X21pbl9ieXBvaW50X2F2Zy5zY2FsZWRhY3Jvc3NhbGxgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBSIHNxdWFyZWRgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICldCgojcm91bmQgdG8gMiBzaWduaWZpY2FudCBmaWd1cmVzCgojbmFtZXMgb2YgbnVtZXJpYyBjb2x1bW5zCm51bWVyaWNfY29scyA8LSBuYW1lcyhiZXN0X21vZGVsX3NidF9qYWNjYXJkX3RhYmxlX2Zvcm1hdHRlZC5yKVtzYXBwbHkoYmVzdF9tb2RlbF9zYnRfamFjY2FyZF90YWJsZV9mb3JtYXR0ZWQuciwgaXMubnVtZXJpYyldCgojIEFwcGx5IHNpZ25pZigpIG9ubHkgdG8gbnVtZXJpYyBjb2x1bW5zCmJlc3RfbW9kZWxfc2J0X2phY2NhcmRfdGFibGVfZm9ybWF0dGVkLnJbLCAobnVtZXJpY19jb2xzKSA6PSBsYXBwbHkoLlNELCBmdW5jdGlvbih4KSBpZiAoaXMubnVtZXJpYyh4KSkgc2lnbmlmKHgsIGRpZ2l0cyA9IDIpIGVsc2UgeCksIC5TRGNvbHMgPSBudW1lcmljX2NvbHNdCgojY2hhbmdlIGNvbHVtbiBuYW1lcywgaW4gY2FwdGlvbiBub3RlIHRoYXQgYWxsIHZhcmlhYmxlcyBhcmUgY2VudGVyZWQgYW5kIHNjYWxlZApjb2xuYW1lcyhiZXN0X21vZGVsX3NidF9qYWNjYXJkX3RhYmxlX2Zvcm1hdHRlZC5yKSA8LSBjKAoiUmFuayIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoiSW50ZXJjZXB0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiJBcmVhIiwgICAgICAgI3NjYWxlZCBhY3Jvc3MgYWxsICAgICAgICAgICAgICAgICAgICAKIkF2ZXJhZ2UgZGVwdGgiLCAgICAgICAgICAgICAgICAgIAoiRGVwdGggcmFuZ2UiLCAgICAgICAgICAgICAgICAKIk51bWJlciBvZiB0b3dzIiwgICAgIAoiQXZlcmFnZSBsYXRpdHVkZSIsICAgICAgICAgICAgICAgCiJMYXRpdHVkZSByYW5nZSIsICAgICAgICAgICAgIAoiU3BlY2llcyBjb3VudCIsICAgICAgICAgICAgICAgICAgCiJSZWxhdGl2ZSBjYXRjaCIsICNzY2FsZWQgd2l0aGluIHJlZ2lvbiAgICAKIlNlYXNvbiIsCiJTdXJ2ZXkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoiQXZlcmFnZSBtaW5pbXVtIHRlbXBlcmF0dXJlIiwgICAgICAgICAgICAKIlN1cnZleSAqIHJlbGF0aXZlIGNhdGNoIiwgICAgICAgICAgICAKIlN1cnZleSAqIGF2ZyBtaW4gdGVtcGVyYXR1cmUiLAoiUiBzcXVhcmVkIiwKcGFzdGUwKCJcdTAzOTQiLCIgQUlDYyIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApwYXN0ZTAoIlx1MDNDOSIpKQoKCgojc2F2ZSBhcyBjc3YKCmZ3cml0ZShiZXN0X21vZGVsX3NidF9qYWNjYXJkX3RhYmxlX2Zvcm1hdHRlZC5yLGhlcmU6OmhlcmUoIm91dHB1dCIsImJlc3RfbW9kZWxfc2J0X2phY2NhcmRfdGFibGVfZm9ybWF0dGVkLmNzdiIpKQpgYGAKCiMjI1ByZWRpY3QgZGlzc2ltaWxhcml0eSBhY3Jvc3MgeWVhcnMgdXNpbmcgYXZlcmFnZWQgbW9kZWwgKG1vZGVsX2F2Z19kZWx0YTQpCmBgYHtyfQpkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zIDwtIGNvcHkoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKCiAgI2FsbG93aW5nIHRlbXAgYW5kIGZpc2hpbmcgdG8gdmFyeSAoYWthIG5vIGNoYW5nZXMpCiAgZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc1sscHJlZF9kaXNzaW0gOj0gcHJlZGljdChtb2RlbF9hdmdfZGVsdGE0LCBzZS5maXQgPSBULCBmdWxsID0gRilbWzFdXV1bLHByZWRfc2UgOj0gcHJlZGljdChtb2RlbF9hdmdfZGVsdGE0LCBzZS5maXQgPSBULCBmdWxsID0gRilbWzJdXV0gI2Z1bGwgYWxsb3dzIHVzIHRvIHN3aXRjaCBiYWNrIHRvIG1peGVkIGVmZmVjdCBtb2RlbHMKCiAgI1doYXQncyB0aGUgUl4yIHZhbHVlPwogIHIuc3F1YXJlZEdMTU0obG0oZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnMsIGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlIH4gcHJlZF9kaXNzaW0pKQogICNSMiA9IDAuOTQ1ODUwMQogIAogICNjb25zdGFudCB0ZW1wIGluIHJlZ2lvbnMgKGFrYSB0YWtlIG1lYW4gb2YgdGVtcGVyYXR1cmUgdmFsdWVzIHdpdGhpbiBzdXJ2ZXkgdW5pdHMgc28gdGhleSBhcmUgdGhlIHNhbWUgdmFsdWUgd2l0aGluIGVhY2ggeWVhciBmb3IgYSBzdXJ2ZXkpCiAgZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGlucmVnIDwtIGNvcHkoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKICBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1waW5yZWdbLHllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsOj1tZWFuKHllYXJseV9taW5fYnlwb2ludF9hdmcuc2NhbGVkYWNyb3NzYWxsKSwuKHN1cnZleV91bml0KV0KICBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1waW5yZWdbLHByZWRfZGlzc2ltIDo9IHByZWRpY3QobW9kZWxfYXZnX2RlbHRhNCwgc2UuZml0ID0gVCwgZnVsbCA9IEYsIG5ld2RhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1waW5yZWcpW1sxXV1dWyxwcmVkX3NlIDo9IHByZWRpY3QobW9kZWxfYXZnX2RlbHRhNCwgc2UuZml0ID0gVCwgZnVsbCA9IEYpW1syXV1dCiAgCiAgICAjV2hhdCdzIHRoZSBSXjIgdmFsdWU/CiAgci5zcXVhcmVkR0xNTShsbShkYXRhID0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGlucmVnLCBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSB+IHByZWRfZGlzc2ltKSkKICAjUjIgPSAwLjkzNzA0MzMgKG9ubHkgZmlzaGluZyEhKQoKICAjY29uc3RhbnQgZmlzaGluZyBpbiByZWdpb25zIChha2EgdGFrZSBtZWFuIG9mIGZpc2hpbmcgdmFsdWVzIHdpdGhpbiBzdXJ2ZXkgdW5pdHMgc28gdGhleSBhcmUgdGhlIHNhbWUgdmFsdWUgd2l0aGluIGVhY2ggeWVhciBmb3IgYSBzdXJ2ZXkpCiAgZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50ZmlzaGluZ2lucmVnIDwtIGNvcHkoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKICBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnRmaXNoaW5naW5yZWdbLHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnOj1tZWFuKHN1bW1lZF90b25uZXNfc2NhbGVkX2J5cmVnKSwuKHN1cnZleV91bml0KV0KICAKICAgIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudGZpc2hpbmdpbnJlZ1sscHJlZF9kaXNzaW0gOj0gcHJlZGljdChtb2RlbF9hdmdfZGVsdGE0LCBzZS5maXQgPSBULCBmdWxsID0gRiwgbmV3ZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudGZpc2hpbmdpbnJlZylbWzFdXV1bLHByZWRfc2UgOj0gcHJlZGljdChtb2RlbF9hdmdfZGVsdGE0LCBzZS5maXQgPSBULCBmdWxsID0gRilbWzJdXV0KICAKICAgICNXaGF0J3MgdGhlIFJeMiB2YWx1ZT8KICByLnNxdWFyZWRHTE1NKGxtKGRhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnRmaXNoaW5naW5yZWcsIGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlIH4gcHJlZF9kaXNzaW0pKQogICNSMiA9IDAuOTM1NjQyIChvbmx5IHRlbXBlcmF0dXJlISEpCgojYW5kIHRoZW4gd2l0aCBjb25zaXN0ZW50IHRlbXAgYW5kIGZpc2hpbmcgaW4gcmVnaW9ucyAoYWthIHRha2UgbWVhbiBvZiBib3RoIG1pbiB0ZW1wIGFuZCBmaXNoaW5nKQpkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1wZmlzaGluZ2lucmVnIDwtIGNvcHkoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdCkKZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGZpc2hpbmdpbnJlZ1ssc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWc6PW1lYW4oc3VtbWVkX3Rvbm5lc19zY2FsZWRfYnlyZWcpLC4oc3VydmV5X3VuaXQpXVsseWVhcmx5X21pbl9ieXBvaW50X2F2Zy5zY2FsZWRhY3Jvc3NhbGw6PW1lYW4oeWVhcmx5X21pbl9ieXBvaW50X2F2Zy5zY2FsZWRhY3Jvc3NhbGwpLC4oc3VydmV5X3VuaXQpXQoKICAgIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBmaXNoaW5naW5yZWdbLHByZWRfZGlzc2ltIDo9IHByZWRpY3QobW9kZWxfYXZnX2RlbHRhNCwgc2UuZml0ID0gVCwgZnVsbCA9IEYsIG5ld2RhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1wZmlzaGluZ2lucmVnKVtbMV1dXVsscHJlZF9zZSA6PSBwcmVkaWN0KG1vZGVsX2F2Z19kZWx0YTQsIHNlLmZpdCA9IFQsIGZ1bGwgPSBGKVtbMl1dXQogIAogICAgI1doYXQncyB0aGUgUl4yIHZhbHVlPwogIHIuc3F1YXJlZEdMTU0obG0oZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBmaXNoaW5naW5yZWcsIGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlIH4gcHJlZF9kaXNzaW0pKQogICNSMiA9IDAuOTI4ODU0OSAob25seSBvdGhlciB2YXJpYWJsZXMhISEgbm90IHRlbXAgb3IgZmlzaGluZykKCgojYWxsb3dpbmcgdGVtcCBhbmQgZmlzaGluZyB0byB2YXJ5IHdpdGhpbiByZWdzIChub3JtYWwpCiAgICBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zWyxwcmVkX2Rpc3NpbSA6PSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0KG1vZGVsX2F2Z19kZWx0YTQsIHNlLmZpdCA9IFQsIGZ1bGwgPSBGLCBuZXdkYXRhID0gICBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zKVtbMV1dXVsscHJlZF9zZSA6PSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3QobW9kZWxfYXZnX2RlbHRhNCwgc2UuZml0ID0gVCwgZnVsbCA9IEYsIG5ld2RhdGEgPSAgIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnMpW1syXV1dCiAgCiNhbGxvd2luZyBvbmx5IGZpc2hpbmcgdG8gdmFyeSB3aXRoaW4gcmVnaW9ucyAod2l0aCBtZWFuIHRlbXApCiAgCiAgIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBpbnJlZ1sscHJlZF9kaXNzaW0gOj0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3QobW9kZWxfYXZnX2RlbHRhNCwgc2UuZml0ID0gVCwgZnVsbCA9IEYsIG5ld2RhdGEgPSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1waW5yZWcpW1sxXV1dWyxwcmVkX3NlIDo9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdChtb2RlbF9hdmdfZGVsdGE0LCBzZS5maXQgPSBULCBmdWxsID0gRiwgbmV3ZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudHRlbXBpbnJlZylbWzJdXV0KCgoKI0ZPUiBDT0xPUiBUTyBNQVRDSAojc29ydCBjb2xvciBsaW5rIGJ5IHN1cnZleSBuYW1lIHNlYXNvbgojYWxwaGFiZXRpY2FsIG9yZGVyCmNvbG9yX2xpbmtfYWxwaGEgPC0gc2V0b3JkZXIoY29sb3JfbGluaywgc3VydmV5X3VuaXQpCgojZXhjbHVkZSBzdXJ2ZXlzIHdlIGRvbid0IGluY2x1ZGUKY29sb3JfbGlua19hbHBoYSA8LSBjb2xvcl9saW5rX2FscGhhW3N1cnZleV91bml0ICVpbiUgdW5pcXVlKGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnMkc3VydmV5X3VuaXQpLF0KCmNvbG9yX2FscGhhX29yZGVyIDwtIGNvbG9yX2xpbmtfYWxwaGFbLGhleF0KbGFiZWxfYWxwaGFfb3JkZXIgPC0gY29sb3JfbGlua19hbHBoYVssU3VydmV5X05hbWVfU2Vhc29uXQogIAojIAojICNtYWludGFpbiB0ZW1wIGFuZCBmaXNoaW5nCiMgI3Bsb3QKIyBwcmVkaWN0ZWRfdmFsdWVzX3RlbXBfZmlzaGluZyA8LSBnZ3Bsb3QoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9ucykgKwojICAgZ2VvbV9wb2ludChhZXMoeCA9IHllYXIsIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSwgY29sb3IgPSBzdXJ2ZXlfdW5pdCkpICsKIyAgIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSBwcmVkX2Rpc3NpbSwgY29sb3IgPSBzdXJ2ZXlfdW5pdCkpICsKIyAgIGdlb21fcmliYm9uKGFlcyh4ID0geWVhciwgeW1pbiA9IHByZWRfZGlzc2ltLXByZWRfc2UsIHltYXggPSBwcmVkX2Rpc3NpbStwcmVkX3NlLCBmaWxsID0gc3VydmV5X3VuaXQpLCBhbHBoYSA9IDAuMykgKwojICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2FscGhhX29yZGVyLCBsYWJlbHMgPSBsYWJlbF9hbHBoYV9vcmRlciwgbmFtZSA9ICJTdXJ2ZXkiKSArCiMgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9hbHBoYV9vcmRlciwgbGFiZWxzID0gbGFiZWxfYWxwaGFfb3JkZXIsIG5hbWUgPSAiU3VydmV5IikgKwojICAgbGFicyh4ID0gIlllYXIiLHkgPSAiQXZlcmFnZSBhbm51YWwgdG90YWxcbkJyYXkgQ3VydGlzIGRpc3NpbWlsYXJpdHkiKSArCiMgICB5bGltKDAsMS41KSArCiMgICB0aGVtZV9jbGFzc2ljKCkgKwojICAgZ2d0aXRsZSgiQXZlcmFnZSBtb2RlbCBwcmVkaWN0aW9ucyIpCiMgCiMgI2F2ZXJhZ2UgdGVtcCBhbmQgZmlzaGluZyBmb3IgZWFjaCByZWdpb24KIyBwcmVkaWN0ZWRfdmFsdWVzX3RlbXBfZmlzaGluZ19tZWFudGVtcGZpc2hpbmdpbnN1cnZleSA8LSBnZ3Bsb3QoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGZpc2hpbmdpbnJlZykgKwojICAgZ2VvbV9wb2ludChhZXMoeCA9IHllYXIsIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSwgY29sb3IgPSBzdXJ2ZXlfdW5pdCkpICsKIyAgIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSBwcmVkX2Rpc3NpbSwgY29sb3IgPSBzdXJ2ZXlfdW5pdCkpICsKIyAgIGdlb21fcmliYm9uKGFlcyh4ID0geWVhciwgeW1pbiA9IHByZWRfZGlzc2ltLXByZWRfc2UsIHltYXggPSBwcmVkX2Rpc3NpbStwcmVkX3NlLCBmaWxsID0gc3VydmV5X3VuaXQpLCBhbHBoYSA9IDAuMykgKwojICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2FscGhhX29yZGVyLCBsYWJlbHMgPSBsYWJlbF9hbHBoYV9vcmRlciwgbmFtZSA9ICJTdXJ2ZXkiKSArCiMgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9hbHBoYV9vcmRlciwgbGFiZWxzID0gbGFiZWxfYWxwaGFfb3JkZXIsIG5hbWUgPSAiU3VydmV5IikgKwojICAgbGFicyh4ID0gIlllYXIiLHkgPSAiQXZlcmFnZSBhbm51YWwgdG90YWxcbkJyYXkgQ3VydGlzIGRpc3NpbWlsYXJpdHkiKSArCiMgICB5bGltKDAsMS41KSArCiMgICB0aGVtZV9jbGFzc2ljKCkgKwojICAgZ2d0aXRsZSgiQXZlcmFnZSBtb2RlbCBwcmVkaWN0aW9ucyB3aXRoIG1lYW5cbnN1cnZleSB0ZW1wZXJhdHVyZSBhbmQgZmlzaGluZyBwcmVzc3VyZSIpCiMgCiMgI2F2ZXJhZ2UgdGVtcCBhbmQgZmlzaGluZyBhY3Jvc3MgYWxsIHJlZ2lvbnMgKCNCUk9LRU4gTk9UIFNVUkUgV0hBVCdTIEhBUFBFTklORyBIRVJFKQojIHByZWRpY3RlZF92YWx1ZXNfdGVtcF9maXNoaW5nX21lYW50ZW1wZmlzaGluZyA8LSBnZ3Bsb3QoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGZpc2hpbmcpICsKIyAgIGdlb21fcG9pbnQoYWVzKHggPSB5ZWFyLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUsIGNvbG9yID0gc3VydmV5X3VuaXQpKSArCiMgICBnZW9tX2xpbmUoYWVzKHggPSB5ZWFyLCB5ID0gcHJlZF9kaXNzaW0sIGNvbG9yID0gc3VydmV5X3VuaXQpKSArCiMgICBnZW9tX3JpYmJvbihhZXMoeCA9IHllYXIsIHltaW4gPSBwcmVkX2Rpc3NpbS1wcmVkX3NlLCB5bWF4ID0gcHJlZF9kaXNzaW0rcHJlZF9zZSwgZmlsbCA9IHN1cnZleV91bml0KSwgYWxwaGEgPSAwLjEpICsKIyAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9hbHBoYV9vcmRlciwgbGFiZWxzID0gbGFiZWxfYWxwaGFfb3JkZXIsIG5hbWUgPSAiU3VydmV5IikgKwojICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JfYWxwaGFfb3JkZXIsIGxhYmVscyA9IGxhYmVsX2FscGhhX29yZGVyLCBuYW1lID0gIlN1cnZleSIpICsKIyAgIGxhYnMoeCA9ICJZZWFyIix5ID0gIkF2ZXJhZ2UgYW5udWFsIHRvdGFsXG5CcmF5IEN1cnRpcyBkaXNzaW1pbGFyaXR5IikgKwojICAgeWxpbSgwLDEuNSkgKwojICAgdGhlbWVfY2xhc3NpYygpICsKIyAgIGdndGl0bGUoIkF2ZXJhZ2UgbW9kZWwgcHJlZGljdGlvbnMgd2l0aCBtZWFuXG5vdmVyZWFsbCB0ZW1wZXJhdHVyZSBhbmQgZmlzaGluZyBwcmVzc3VyZSIpCiMgCiMgI21lcmdlIHBsb3RzCiMgcHJlZGljdGVkX3ZhbHVlc19zYnRfamFjY2FyZF9maXNoaW5nX21lcmdlIDwtIGNvd3Bsb3Q6OnBsb3RfZ3JpZChwcmVkaWN0ZWRfdmFsdWVzX3RlbXBfZmlzaGluZywKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkX3ZhbHVlc190ZW1wX2Zpc2hpbmdfbWVhbnRlbXBmaXNoaW5naW5zdXJ2ZXksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RlZF92YWx1ZXNfdGVtcF9maXNoaW5nX21lYW50ZW1wZmlzaGluZywKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEpCiMgCiMgZ2dzYXZlKHByZWRpY3RlZF92YWx1ZXNfc2J0X2phY2NhcmRfZmlzaGluZ19tZXJnZSwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSwgZmlsZW5hbWUgPSAicHJlZGljdGVkX3ZhbHVlc19zYnRfamFjY2FyZF9maXNoaW5nX21lcmdlLmpwZyIsIGhlaWdodCA9IDMwLCB3aWR0aCA9IDE0KQpgYGAKClRha2UgZGlzc2ltaWxhcml0eSB2YWx1ZXMgZnJvbSByYW5kb20gbm9ybWFsIGRpc3RyaWJ1dGlvbiBmb3IgZWFjaCB5ZWFyIGZvciBlYWNoIHJlZ2lvbiwgYW5kIHRoZW4gY2FsY3VsYXRlIHNsb3BlICgxMDAwIHRpbWVzKS4gRG8gdGhpcyBmb3I6CiAtIEZpc2hpbmcgYW5kIHRlbXBlcmF0dXJlIHZhcnkgaW50ZXJhbm51YWxseSB3aXRoaW4gc3VydmV5cwogLSBUZW1wZXJhdHVyZSBpcyBoZWxkIGNvbnN0YW50IChhcyBtZWFuIG92ZXIgdGltZSBzZXJpZXMgZm9yIGEgc3VydmV5KSwgYnV0IGZpc2hpbmcgdmFyaWVzIChhbGxvd3MgdXMgdG8gbG9vayBhdCByZWxhdGl2ZSB2YXJpYW5jZSBleHBsYWluZWQpCiAtIEZpc2hpbmcgaXMgaGVsZCBjb25zdGFudCAoYXMgbWVhbiBvdmVyIHRpbWUgc2VyaWVzIGZvciBhIHN1cnZleSksIGJ1dCB0ZW1wZXJhdHVyZSB2YXJpZXMgKGFsbG93cyB1cyB0byBsb29rIGF0IHJlbGF0aXZlIHZhcmlhbmNlIGV4cGxhaW5lZCkKIC0gQm90aCBmaXNoaW5nIGFuZCB0ZW1wZXJhdHVyZSBoZWxkIGNvbnN0YW50IChhbGxvd3MgdXMgdG8gc2VlIHJvbGUgb2Ygb3RoZXIgY29tcG9uZW50cyBvZiB0aGUgbW9kZWwpCiAKYGBge3J9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiNmdWxsIHByZWRpY3Rpb25zCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiN0YWJsZSB3aXRoIHByZWRpY3RlZCBkaXNzaW1pbGFyaXR5IHZhbHVlcyBhbmQgc3RhbmRhcmQgZXJyb3Igb2YgYWxsIHByZWRpY3RlZCBkaXNzaW1pbGFyaXR5IHZhbHVlcyAoYnkgeWVhcikKdGFibGUgPC0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc1ssLihzdXJ2ZXlfdW5pdCwgcHJlZF9kaXNzaW0sIHByZWRfc2UsIHllYXIpXQojMCkgbWFrZSBkYXRhdGFibGUgdG8gcG9wdWxhdGUKICBwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnMgPC0gZGF0YS50YWJsZSgpCiMxKSBORVcgUFJFRElDVEVEIFZBTFVFUyBGUk9NIERJU1RSSUJVVElPTgpmb3IgKGkgaW4gMToxMDAwKXsKICB0YWJsZVsscm5vcm1fcHJlZCA6PSBybm9ybSgxLCBtZWFuID0gcHJlZF9kaXNzaW0sIHNkID0gcHJlZF9zZSksLih5ZWFyLCBzdXJ2ZXlfdW5pdCldCiMyKSBDQUxDVUxBVEUgTElORUFSIE1PREVMIFRPIEVYVFJBQ1QgU1VSVkVZIFNQRUNJRklDIFRSRU5EIFZBTFVFUwogIGphY2NhcmRfdG90YWxfcHJlZGljdGVkX2xtX3NpbmdsZXJ1biA8LSBsbShybm9ybV9wcmVkIH4geWVhcipzdXJ2ZXlfdW5pdCxkYXRhID0gdGFibGUpCgogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuIDwtIGRhdGEudGFibGUoc3VtbWFyeShqYWNjYXJkX3RvdGFsX3ByZWRpY3RlZF9sbV9zaW5nbGVydW4pJGNvZWZmaWNpZW50cykKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1blssdmFyIDo9IHJvd25hbWVzKHN1bW1hcnkoamFjY2FyZF90b3RhbF9wcmVkaWN0ZWRfbG1fc2luZ2xlcnVuKSRjb2VmZmljaWVudHMpXQogIAogICNsaW1pdCB0byBpbnRlcmFjdGlvbnMgb25seSAoY2hlY2sgdGhpcyBpZiB0aGVyZSBhcmUgYW55IG1vZGVsIGNoYW5nZXMhKSByb3cgMiBhbmQgcm93cyAzNDo2NAogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuIDwtIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuW2MoMiwzNDo2NCksXQogIAogICNhZGp1c3Qgc3VydmV5IHVuaXQgbmFtZSBieSBkZWxldGluZyBiZWdpbm5pbmcgb2Ygc3RyaW5nCiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5bLHN1cnZleV91bml0IDo9IHN1YnN0cih2YXIsIDE3LCBzdHJfbGVuZ3RoKHZhcikpXVt2YXIgPT0gInllYXIiLHN1cnZleV91bml0IDo9ICJBSSJdCiAgCiAgI2NhbGN1bGF0ZSBpbnRlcmFjdGlvbiBjb2VmZmljaWVudHMKICBBSV9lc3RpbWF0ZSA8LSBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1blsxLEVzdGltYXRlXQogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuWzEsZXN0aW1hdGUgOj0gQUlfZXN0aW1hdGVdCiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5bMjozMixlc3RpbWF0ZSA6PSAoQUlfZXN0aW1hdGUgKyBFc3RpbWF0ZSldCiAgCiAgcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zIDwtIHJiaW5kKHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVucywgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5bLC4oc3VydmV5X3VuaXQsIGVzdGltYXRlKV0pCiAgCiAgcHJpbnQoaSkKfQogIAojcmVkdWNlIHRvIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbgpwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNbLG1lYW5fZGlzc2ltX2NvZWY6PSBtZWFuKGVzdGltYXRlKSxzdXJ2ZXlfdW5pdF1bLHNkX2Rpc3NpbSA6PSBzZChlc3RpbWF0ZSksLihzdXJ2ZXlfdW5pdCldCgpwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnMuc3VtbWFyeSA8LSB1bmlxdWUocHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zWywuKHN1cnZleV91bml0LCBtZWFuX2Rpc3NpbV9jb2VmLCBzZF9kaXNzaW0pXSkKCnByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVucy5zdW1tYXJ5WyxwcmVkX3R5cGUgOj0gImZ1bGwiXQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKI3ByZWRpY3Rpb25zIHdpdGggdGVtcCBoZWxkIGNvbnN0YW50IGFuZCBmaXNoaW5nIHN0aWxsIHZhcnlpbmcgZnJvbSB5ZWFyIHRvIHllYXIKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKI3RhYmxlIHdpdGggcHJlZGljdGVkIGRpc3NpbWlsYXJpdHkgdmFsdWVzIGFuZCBzdGFuZGFyZCBlcnJvciBvZiBhbGwgcHJlZGljdGVkIGRpc3NpbWlsYXJpdHkgdmFsdWVzIChieSB5ZWFyKQp0YWJsZV9jb25zdGFudHRlbXAgPC0gZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdF9wcmVkaWN0aW9uc19jb25zaXN0ZW50dGVtcGlucmVnWywuKHN1cnZleV91bml0LCBwcmVkX2Rpc3NpbSwgcHJlZF9zZSwgeWVhcildCiMwKSBtYWtlIGRhdGF0YWJsZSB0byBwb3B1bGF0ZQogIHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXAgPC0gZGF0YS50YWJsZSgpCiMxKSBORVcgUFJFRElDVEVEIFZBTFVFUyBGUk9NIERJU1RSSUJVVElPTgpmb3IgKGkgaW4gMToxMDAwKXsKICB0YWJsZV9jb25zdGFudHRlbXBbLHJub3JtX3ByZWQgOj0gcm5vcm0oMSwgbWVhbiA9IHByZWRfZGlzc2ltLCBzZCA9IHByZWRfc2UpLC4oeWVhciwgc3VydmV5X3VuaXQpXQojMikgQ0FMQ1VMQVRFIExJTkVBUiBNT0RFTCBGT1IgU0xPUEUgVkFMVUVTCiAgamFjY2FyZF90b3RhbF9wcmVkaWN0ZWRfbG1fc2luZ2xlcnVuX2NvbnN0YW50dGVtcCA8LSBsbShybm9ybV9wcmVkIH4geWVhcipzdXJ2ZXlfdW5pdCxkYXRhID0gdGFibGVfY29uc3RhbnR0ZW1wKQoKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXAgPC0gZGF0YS50YWJsZShzdW1tYXJ5KGphY2NhcmRfdG90YWxfcHJlZGljdGVkX2xtX3NpbmdsZXJ1bl9jb25zdGFudHRlbXApJGNvZWZmaWNpZW50cykKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXBbLHZhciA6PSByb3duYW1lcyhzdW1tYXJ5KGphY2NhcmRfdG90YWxfcHJlZGljdGVkX2xtX3NpbmdsZXJ1bl9jb25zdGFudHRlbXApJGNvZWZmaWNpZW50cyldCiAgCiAgI2xpbWl0IHRvIGludGVyYWN0aW9ucyBvbmx5IChjaGVjayB0aGlzIGlmIHRoZXJlIGFyZSBhbnkgbW9kZWwgY2hhbmdlcyEpIHJvdyAyIGFuZCByb3dzIDM0OjY0CiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnR0ZW1wIDwtIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcFtjKDIsMzQ6NjQpLF0KICAKICAjYWRqdXN0IHN1cnZleSB1bml0IG5hbWUgYnkgZGVsZXRpbmcgYmVnaW5uaW5nIG9mIHN0cmluZwogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcFssc3VydmV5X3VuaXQgOj0gc3Vic3RyKHZhciwgMTcsIHN0cl9sZW5ndGgodmFyKSldW3ZhciA9PSAieWVhciIsc3VydmV5X3VuaXQgOj0gIkFJIl0KICAKICAjY2FsY3VsYXRlIGludGVyYWN0aW9uIGNvZWZmaWNpZW50cwogIEFJX2VzdGltYXRlIDwtIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcFsxLEVzdGltYXRlXQogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcFsxLGVzdGltYXRlIDo9IEFJX2VzdGltYXRlXQogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcFsyOjMyLGVzdGltYXRlIDo9IChBSV9lc3RpbWF0ZSArIEVzdGltYXRlKV0KICAKICBwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNfY29uc3RhbnR0ZW1wIDwtIHJiaW5kKHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXAsIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcFssLihzdXJ2ZXlfdW5pdCwgZXN0aW1hdGUpXSkKICAKICBwcmludChpKQp9CiAgCiNyZWR1Y2UgdG8gbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uCnByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXBbLG1lYW5fZGlzc2ltX2NvZWY6PSBtZWFuKGVzdGltYXRlKSxzdXJ2ZXlfdW5pdF1bLHNkX2Rpc3NpbSA6PSBzZChlc3RpbWF0ZSksLihzdXJ2ZXlfdW5pdCldCgpwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNjb25zdGFudF90ZW1wLnN1bW1hcnkgPC0gdW5pcXVlKHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXBbLC4oc3VydmV5X3VuaXQsIG1lYW5fZGlzc2ltX2NvZWYsIHNkX2Rpc3NpbSldKQoKcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zY29uc3RhbnRfdGVtcC5zdW1tYXJ5WyxwcmVkX3R5cGUgOj0gInRlbXBfY29uc3RhbnQiXQoKcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zLnN1bW1hcnkgPC0gcmJpbmQocHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zLnN1bW1hcnksIHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc2NvbnN0YW50X3RlbXAuc3VtbWFyeSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiNwcmVkaWN0aW9ucyB3aXRoIGZpc2hpbmcgaGVsZCBjb25zdGFudCAoYW5kIHRlbXBlcmF0dXJlIHZhcnlpbmcpCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiN0YWJsZSB3aXRoIHByZWRpY3RlZCBkaXNzaW1pbGFyaXR5IHZhbHVlcyBhbmQgc3RhbmRhcmQgZXJyb3Igb2YgYWxsIHByZWRpY3RlZCBkaXNzaW1pbGFyaXR5IHZhbHVlcyAoYnkgeWVhcikKdGFibGVfY29uc3RhbnRmaXNoaW5nIDwtIGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRfcHJlZGljdGlvbnNfY29uc2lzdGVudGZpc2hpbmdpbnJlZ1ssLihzdXJ2ZXlfdW5pdCwgcHJlZF9kaXNzaW0sIHByZWRfc2UsIHllYXIpXQojMCkgbWFrZSBkYXRhdGFibGUgdG8gcG9wdWxhdGUKICBwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNfY29uc3RhbnRmaXNoaW5nIDwtIGRhdGEudGFibGUoKQojMSkgTkVXIFBSRURJQ1RFRCBWQUxVRVMgRlJPTSBESVNUUklCVVRJT04KZm9yIChpIGluIDE6MTAwMCl7CiAgdGFibGVfY29uc3RhbnRmaXNoaW5nWyxybm9ybV9wcmVkIDo9IHJub3JtKDEsIG1lYW4gPSBwcmVkX2Rpc3NpbSwgc2QgPSBwcmVkX3NlKSwuKHllYXIsIHN1cnZleV91bml0KV0KIzIpIENBTENVTEFURSBMSU5FQVIgTU9ERUwgRk9SIFNMT1BFIFZBTFVFUwogIGphY2NhcmRfdG90YWxfcHJlZGljdGVkX2xtX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmcgPC0gbG0ocm5vcm1fcHJlZCB+IHllYXIqc3VydmV5X3VuaXQsZGF0YSA9IHRhYmxlX2NvbnN0YW50ZmlzaGluZykKCiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnRmaXNoaW5nIDwtIGRhdGEudGFibGUoc3VtbWFyeShqYWNjYXJkX3RvdGFsX3ByZWRpY3RlZF9sbV9zaW5nbGVydW5fY29uc3RhbnRmaXNoaW5nKSRjb2VmZmljaWVudHMpCiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnRmaXNoaW5nWyx2YXIgOj0gcm93bmFtZXMoc3VtbWFyeShqYWNjYXJkX3RvdGFsX3ByZWRpY3RlZF9sbV9zaW5nbGVydW5fY29uc3RhbnRmaXNoaW5nKSRjb2VmZmljaWVudHMpXQogIAogICNsaW1pdCB0byBpbnRlcmFjdGlvbnMgb25seSAoY2hlY2sgdGhpcyBpZiB0aGVyZSBhcmUgYW55IG1vZGVsIGNoYW5nZXMhKSByb3cgMiBhbmQgcm93cyAzNDo2NAogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50ZmlzaGluZyA8LSBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmdbYygyLDM0OjY0KSxdCiAgCiAgI2FkanVzdCBzdXJ2ZXkgdW5pdCBuYW1lIGJ5IGRlbGV0aW5nIGJlZ2lubmluZyBvZiBzdHJpbmcKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmdbLHN1cnZleV91bml0IDo9IHN1YnN0cih2YXIsIDE3LCBzdHJfbGVuZ3RoKHZhcikpXVt2YXIgPT0gInllYXIiLHN1cnZleV91bml0IDo9ICJBSSJdCiAgCiAgI2NhbGN1bGF0ZSBpbnRlcmFjdGlvbiBjb2VmZmljaWVudHMKICBBSV9lc3RpbWF0ZSA8LSBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmdbMSxFc3RpbWF0ZV0KICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmdbMSxlc3RpbWF0ZSA6PSBBSV9lc3RpbWF0ZV0KICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmdbMjozMixlc3RpbWF0ZSA6PSAoQUlfZXN0aW1hdGUgKyBFc3RpbWF0ZSldCiAgCiAgcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zX2NvbnN0YW50ZmlzaGluZyA8LSByYmluZChwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNfY29uc3RhbnRmaXNoaW5nLCBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudGZpc2hpbmdbLC4oc3VydmV5X3VuaXQsIGVzdGltYXRlKV0pCiAgCiAgcHJpbnQoaSkKfQogIAojcmVkdWNlIHRvIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbgpwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNfY29uc3RhbnRmaXNoaW5nWyxtZWFuX2Rpc3NpbV9jb2VmOj0gbWVhbihlc3RpbWF0ZSksc3VydmV5X3VuaXRdWyxzZF9kaXNzaW0gOj0gc2QoZXN0aW1hdGUpLC4oc3VydmV5X3VuaXQpXQoKcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zY29uc3RhbnRfZmlzaGluZy5zdW1tYXJ5IDwtIHVuaXF1ZShwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNfY29uc3RhbnRmaXNoaW5nWywuKHN1cnZleV91bml0LCBtZWFuX2Rpc3NpbV9jb2VmLCBzZF9kaXNzaW0pXSkKCnByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc2NvbnN0YW50X2Zpc2hpbmcuc3VtbWFyeVsscHJlZF90eXBlIDo9ICJmaXNoaW5nX2NvbnN0YW50Il0KCnByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVucy5zdW1tYXJ5IDwtIHJiaW5kKHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVucy5zdW1tYXJ5LCBwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNjb25zdGFudF9maXNoaW5nLnN1bW1hcnkpCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKI3ByZWRpY3Rpb25zIHdpdGggYm90aCBmaXNoaW5nIGFuZCB0ZW1wZXJhdHVyZSBoZWxkIGNvbnN0YW50ICh2YXJpYWJpbGl0eSBnb2VzIHRvIG90aGVyIGZhY3RvcnMgd2UgZG9uJ3QgYWNjb3VudCBmb3IpCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiN0YWJsZSB3aXRoIHByZWRpY3RlZCBkaXNzaW1pbGFyaXR5IHZhbHVlcyBhbmQgc3RhbmRhcmQgZXJyb3Igb2YgYWxsIHByZWRpY3RlZCBkaXNzaW1pbGFyaXR5IHZhbHVlcyAoYnkgeWVhcikKdGFibGVfY29uc3RhbnR0ZW1wZmlzaGluZyA8LSBkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0X3ByZWRpY3Rpb25zX2NvbnNpc3RlbnR0ZW1wZmlzaGluZ2lucmVnWywuKHN1cnZleV91bml0LCBwcmVkX2Rpc3NpbSwgcHJlZF9zZSwgeWVhcildCiMwKSBtYWtlIGRhdGF0YWJsZSB0byBwb3B1bGF0ZQogIHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXBmaXNoaW5nIDwtIGRhdGEudGFibGUoKQojMSkgTkVXIFBSRURJQ1RFRCBWQUxVRVMgRlJPTSBESVNUUklCVVRJT04KZm9yIChpIGluIDE6MTAwMCl7CiAgdGFibGVfY29uc3RhbnR0ZW1wZmlzaGluZ1sscm5vcm1fcHJlZCA6PSBybm9ybSgxLCBtZWFuID0gcHJlZF9kaXNzaW0sIHNkID0gcHJlZF9zZSksLih5ZWFyLCBzdXJ2ZXlfdW5pdCldCiMyKSBDQUxDVUxBVEUgTElORUFSIE1PREVMIEZPUiBTTE9QRSBWQUxVRVMKICBqYWNjYXJkX3RvdGFsX3ByZWRpY3RlZF9sbV9zaW5nbGVydW5fY29uc3RhbnR0ZW1wZmlzaGluZyA8LSBsbShybm9ybV9wcmVkIH4geWVhcipzdXJ2ZXlfdW5pdCxkYXRhID0gdGFibGVfY29uc3RhbnR0ZW1wZmlzaGluZykKCiAgbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnR0ZW1wZmlzaGluZyA8LSBkYXRhLnRhYmxlKHN1bW1hcnkoamFjY2FyZF90b3RhbF9wcmVkaWN0ZWRfbG1fc2luZ2xlcnVuX2NvbnN0YW50dGVtcGZpc2hpbmcpJGNvZWZmaWNpZW50cykKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXBmaXNoaW5nWyx2YXIgOj0gcm93bmFtZXMoc3VtbWFyeShqYWNjYXJkX3RvdGFsX3ByZWRpY3RlZF9sbV9zaW5nbGVydW5fY29uc3RhbnR0ZW1wZmlzaGluZykkY29lZmZpY2llbnRzKV0KICAKICAjbGltaXQgdG8gaW50ZXJhY3Rpb25zIG9ubHkgKGNoZWNrIHRoaXMgaWYgdGhlcmUgYXJlIGFueSBtb2RlbCBjaGFuZ2VzISkgcm93IDIgYW5kIHJvd3MgMzQ6NjQKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXBmaXNoaW5nIDwtIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcGZpc2hpbmdbYygyLDM0OjY0KSxdCiAgCiAgI2FkanVzdCBzdXJ2ZXkgdW5pdCBuYW1lIGJ5IGRlbGV0aW5nIGJlZ2lubmluZyBvZiBzdHJpbmcKICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXBmaXNoaW5nWyxzdXJ2ZXlfdW5pdCA6PSBzdWJzdHIodmFyLCAxNywgc3RyX2xlbmd0aCh2YXIpKV1bdmFyID09ICJ5ZWFyIixzdXJ2ZXlfdW5pdCA6PSAiQUkiXQogIAogICNjYWxjdWxhdGUgaW50ZXJhY3Rpb24gY29lZmZpY2llbnRzCiAgQUlfZXN0aW1hdGUgPC0gbW9kZWxfY29lZnNfcmVkdWNlZF9wcmVkaWN0aW9uc19zaW5nbGVydW5fY29uc3RhbnR0ZW1wZmlzaGluZ1sxLEVzdGltYXRlXQogIG1vZGVsX2NvZWZzX3JlZHVjZWRfcHJlZGljdGlvbnNfc2luZ2xlcnVuX2NvbnN0YW50dGVtcGZpc2hpbmdbMSxlc3RpbWF0ZSA6PSBBSV9lc3RpbWF0ZV0KICBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXBmaXNoaW5nWzI6MzIsZXN0aW1hdGUgOj0gKEFJX2VzdGltYXRlICsgRXN0aW1hdGUpXQogIAogIHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXBmaXNoaW5nIDwtIHJiaW5kKHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXBmaXNoaW5nLCBtb2RlbF9jb2Vmc19yZWR1Y2VkX3ByZWRpY3Rpb25zX3NpbmdsZXJ1bl9jb25zdGFudHRlbXBmaXNoaW5nWywuKHN1cnZleV91bml0LCBlc3RpbWF0ZSldKQogIAogIyBwcmludChpKQp9CiAgCiNyZWR1Y2UgdG8gbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uCnByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVuc19jb25zdGFudHRlbXBmaXNoaW5nWyxtZWFuX2Rpc3NpbV9jb2VmOj0gbWVhbihlc3RpbWF0ZSksc3VydmV5X3VuaXRdWyxzZF9kaXNzaW0gOj0gc2QoZXN0aW1hdGUpLC4oc3VydmV5X3VuaXQpXQoKcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zY29uc3RhbnRfdGVtcGZpc2hpbmcuc3VtbWFyeSA8LSB1bmlxdWUocHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zX2NvbnN0YW50dGVtcGZpc2hpbmdbLC4oc3VydmV5X3VuaXQsIG1lYW5fZGlzc2ltX2NvZWYsIHNkX2Rpc3NpbSldKQoKcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zY29uc3RhbnRfdGVtcGZpc2hpbmcuc3VtbWFyeVsscHJlZF90eXBlIDo9ICJmaXNoaW5nX2FuZF90ZW1wX2NvbnN0YW50Il0KCnByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVucy5zdW1tYXJ5IDwtIHJiaW5kKHByZWRpY3RlZF9kaXNzaW1fdHJlbmRzX3Jub3JtcnVucy5zdW1tYXJ5LCBwcmVkaWN0ZWRfZGlzc2ltX3RyZW5kc19ybm9ybXJ1bnNjb25zdGFudF90ZW1wZmlzaGluZy5zdW1tYXJ5KQpgYGAKClBsb3R0aW5nIG9ic2VydmVkIHZzIHByZWRpY3RlZApgYGB7cn0KCmphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdCA8LSBqYWNjYXJkX3RvdGFsX2NvZWZzLnJbcHJlZGljdGVkX2Rpc3NpbV90cmVuZHNfcm5vcm1ydW5zLnN1bW1hcnksIG9uID0gInN1cnZleV91bml0Il0KCmphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdFsscHJlZF9sb3dlciA6PSBtZWFuX2Rpc3NpbV9jb2VmLXNkX2Rpc3NpbV1bLHByZWRfdXBwZXIgOj0gbWVhbl9kaXNzaW1fY29lZitzZF9kaXNzaW1dCgojRlVMTCBNT0RFTCwgYm90aCB0ZW1wZXJhdHVyZSBhbmQgZmlzaGluZyBhcmUgYWxsb3dlZCB0byB2YXJ5CmphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9sbSA8LSBsbShlc3RpbWF0ZSB+IG1lYW5fZGlzc2ltX2NvZWYsIGRhdGEgPSBqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHRbcHJlZF90eXBlID09ICJmdWxsIl0pCnN1bW1hcnkoamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2xtKSAjUl4yIDAuNTYKCihqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWQgPC0gZ2dwbG90KGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdFtwcmVkX3R5cGUgPT0gImZ1bGwiXSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHggPSBtZWFuX2Rpc3NpbV9jb2VmLCB5bWluID0gbHdyLCB5bWF4ID0gdXByKSwgY29sb3IgPSAibGlnaHRncmV5IiwgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHkgPSBlc3RpbWF0ZSwgeG1pbiA9IG1lYW5fZGlzc2ltX2NvZWYtc2RfZGlzc2ltLCB4bWF4ID0gbWVhbl9kaXNzaW1fY29lZitzZF9kaXNzaW0pLCBjb2xvciA9ICJsaWdodGdyZXkiLCBsaW5ld2lkdGggPSAwLjQpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gZXN0aW1hdGUsIHggPSBtZWFuX2Rpc3NpbV9jb2VmKSkgKwogIGdlb21fc21vb3RoKGFlcyh5ID0gZXN0aW1hdGUsIHggPSBtZWFuX2Rpc3NpbV9jb2VmKSwgY29sb3IgPSAiZGFya2dyZXkiLGxpbmV0eXBlID0gImRvdHRlZCIsIG1ldGhvZCA9ICJsbSIpICsKICBnZW9tX2FibGluZShhZXMoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSkgKwogIGxpbXMoeCA9IGMobWluKGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdCRwcmVkX2xvd2VyKSxtYXgoamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0JHByZWRfdXBwZXIpKSkgKwogIGxhYnMoeSA9ICJPYnNlcnZlZCDOsi1kaXZlcnNpdHkgdHJlbmQiLHggPSAiUHJlZGljdGVkIM6yLWRpdmVyc2l0eSB0cmVuZFxuIikgKwogIHRoZW1lX2NsYXNzaWMoKQopCgojZmlzaGluZyBjb25zdGFudCAoZmlzaGluZyBjb25zdGFudDsgdGVtcGVyYXR1cmUgdmFyaWVzIG9ubHkpCmphY2NhcmRfZmlzaGluZ19jb25zdGFudF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfbG0gPC0gbG0oZXN0aW1hdGUgfiBtZWFuX2Rpc3NpbV9jb2VmLCBkYXRhID0gamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0W3ByZWRfdHlwZSA9PSAiZmlzaGluZ19jb25zdGFudCJdKQpzdW1tYXJ5KGphY2NhcmRfZmlzaGluZ19jb25zdGFudF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfbG0pIAojVGVtcGVyYXR1cmUgYXMgYSBwcmVkaWN0b3IsIG5vdCBmaXNoaW5nID0gUl4yID0gMC40MCAoZHJvcCBpbiAxNiUgb2YgdmFyaWFuY2UgZXhwbGFpbmVkIHdoZW4geW91IGxvc2UgZmlzaGluZyBhcyBwcmVkaWN0b3IpCgooamFjY2FyZF9maXNoaW5nX2NvbnN0YW50X21vZGVsX29ic2VydmVkX3ByZWRpY3RlZCA8LSBnZ3Bsb3QoamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0W3ByZWRfdHlwZSA9PSAiZmlzaGluZ19jb25zdGFudCJdKSArCmdlb21fZXJyb3JiYXIoYWVzKHggPSBtZWFuX2Rpc3NpbV9jb2VmLCB5bWluID0gbHdyLCB5bWF4ID0gdXByKSwgY29sb3IgPSAibGlnaHRncmV5IiwgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHkgPSBlc3RpbWF0ZSwgeG1pbiA9IG1lYW5fZGlzc2ltX2NvZWYtc2RfZGlzc2ltLCB4bWF4ID0gbWVhbl9kaXNzaW1fY29lZitzZF9kaXNzaW0pLCBjb2xvciA9ICJsaWdodGdyZXkiLCBsaW5ld2lkdGggPSAwLjQpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gZXN0aW1hdGUsIHggPSBtZWFuX2Rpc3NpbV9jb2VmKSkgKwogICAgZ2VvbV9zbW9vdGgoYWVzKHkgPSBlc3RpbWF0ZSwgeCA9IG1lYW5fZGlzc2ltX2NvZWYpLCBjb2xvciA9ICJkYXJrZ3JleSIsbGluZXR5cGUgPSAiZG90dGVkIiwgbWV0aG9kID0gImxtIikgKwogIGdlb21fYWJsaW5lKGFlcyhzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApKSArCiAgICAgIGxpbXMoeCA9IGMobWluKGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdCRwcmVkX2xvd2VyKSxtYXgoamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0JHByZWRfdXBwZXIpKSkgKwogIGxhYnMoeSA9ICJPYnNlcnZlZCDOsi1kaXZlcnNpdHkgdHJlbmQiLHggPSAiUHJlZGljdGVkIM6yLWRpdmVyc2l0eSB0cmVuZFxuKHRlbXBlcmF0dXJlIHZhcmllcyBmaXNoaW5nIGNvbnN0YW50KSIpICsKICB0aGVtZV9jbGFzc2ljKCkKKQoKI3RlbXAgY29uc3RhbnQgKGZpc2hpbmcgb25seTsgdGVtcGVyYXR1cmUgY29uc3RhbnQpCmphY2NhcmRfdGVtcGVyYXR1cmVfY29uc3RhbnRfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2xtIDwtIGxtKGVzdGltYXRlIH4gbWVhbl9kaXNzaW1fY29lZiwgZGF0YSA9IGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9kdFtwcmVkX3R5cGUgPT0gInRlbXBfY29uc3RhbnQiXSkKc3VtbWFyeShqYWNjYXJkX3RlbXBlcmF0dXJlX2NvbnN0YW50X21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF9sbSkgIzAuMjYgRHJvcCBpbiAzMCUgb2YgdmFyaWFuY2UgZXhwbGFpbmVkIHdoZW4geW91IGxvc2UgdGVtcGVyYXR1cmUgYXMgYSBwcmVkaWN0b3IKCihqYWNjYXJkX3RlbXBlcmF0dXJlX2NvbnN0YW50X21vZGVsX29ic2VydmVkX3ByZWRpY3RlZCA8LSBnZ3Bsb3QoamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0W3ByZWRfdHlwZSA9PSAidGVtcF9jb25zdGFudCJdKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeCA9IG1lYW5fZGlzc2ltX2NvZWYsIHltaW4gPSBsd3IsIHltYXggPSB1cHIpLCBjb2xvciA9ICJsaWdodGdyZXkiLCBsaW5ld2lkdGggPSAwLjQpICsKICBnZW9tX2Vycm9yYmFyaChhZXMoeSA9IGVzdGltYXRlLCB4bWluID0gbWVhbl9kaXNzaW1fY29lZi1zZF9kaXNzaW0sIHhtYXggPSBtZWFuX2Rpc3NpbV9jb2VmK3NkX2Rpc3NpbSksIGNvbG9yID0gImxpZ2h0Z3JleSIsIGxpbmV3aWR0aCA9IDAuNCkgKwogIGdlb21fcG9pbnQoYWVzKHkgPSBlc3RpbWF0ZSwgeCA9IG1lYW5fZGlzc2ltX2NvZWYpKSArCiAgICBnZW9tX3Ntb290aChhZXMoeSA9IGVzdGltYXRlLCB4ID0gbWVhbl9kaXNzaW1fY29lZiksIGNvbG9yID0gImRhcmtncmV5IixsaW5ldHlwZSA9ICJkb3R0ZWQiLCBtZXRob2QgPSAibG0iKSArCiAgZ2VvbV9hYmxpbmUoYWVzKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkpICsKICAgICAgbGltcyh4ID0gYyhtaW4oamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0JHByZWRfbG93ZXIpLG1heChqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHQkcHJlZF91cHBlcikpKSArCiAgbGFicyh5ID0gIk9ic2VydmVkIM6yLWRpdmVyc2l0eSB0cmVuZCIseCA9ICJQcmVkaWN0ZWQgzrItZGl2ZXJzaXR5IHRyZW5kXG4oZmlzaGluZyB2YXJpZXMgdGVtcGVyYXR1cmUgY29uc3RhbnQpIikgKwogIHRoZW1lX2NsYXNzaWMoKQopCgojYm90aCB0ZW1wZXJhdHVyZSBhbmQgZmlzaCBoZWxkIGNvbnN0YW50CmphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF90ZW1wZmlzaGNvbnN0YW50aW5zdXJ2ZXlfbG0gPC0gbG0oZXN0aW1hdGUgfiBtZWFuX2Rpc3NpbV9jb2VmLCBkYXRhID0gamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0W3ByZWRfdHlwZSA9PSAiZmlzaGluZ19hbmRfdGVtcF9jb25zdGFudCJdKQpzdW1tYXJ5KGphY2NhcmRfZmlzaGluZ190ZW1wX21vZGVsX29ic2VydmVkX3ByZWRpY3RlZF90ZW1wZmlzaGNvbnN0YW50aW5zdXJ2ZXlfbG0pICMlMjAgI2Ryb3Agb2YgMzYgZnJvbSBmdWxsCgooamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX3RlbXBmaXNoY29uc3RhbnRpbnN1cnZleSA8LSBnZ3Bsb3QoamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0W3ByZWRfdHlwZSA9PSAiZmlzaGluZ19hbmRfdGVtcF9jb25zdGFudCJdKSArCmdlb21fZXJyb3JiYXIoYWVzKHggPSBtZWFuX2Rpc3NpbV9jb2VmLCB5bWluID0gbHdyLCB5bWF4ID0gdXByKSwgY29sb3IgPSAibGlnaHRncmV5IiwgbGluZXdpZHRoID0gMC40KSArCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHkgPSBlc3RpbWF0ZSwgeG1pbiA9IG1lYW5fZGlzc2ltX2NvZWYtc2RfZGlzc2ltLCB4bWF4ID0gbWVhbl9kaXNzaW1fY29lZitzZF9kaXNzaW0pLCBjb2xvciA9ICJsaWdodGdyZXkiLCBsaW5ld2lkdGggPSAwLjQpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gZXN0aW1hdGUsIHggPSBtZWFuX2Rpc3NpbV9jb2VmKSkgKwogICAgZ2VvbV9zbW9vdGgoYWVzKHkgPSBlc3RpbWF0ZSwgeCA9IG1lYW5fZGlzc2ltX2NvZWYpLCBjb2xvciA9ICJkYXJrZ3JleSIsbGluZXR5cGUgPSAiZG90dGVkIiwgbWV0aG9kID0gImxtIikrCiAgZ2VvbV9hYmxpbmUoYWVzKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkpICsKICAgICAgbGltcyh4ID0gYyhtaW4oamFjY2FyZF9maXNoaW5nX3RlbXBfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX2R0JHByZWRfbG93ZXIpLG1heChqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfZHQkcHJlZF91cHBlcikpKSArCiAgbGFicyh5ID0gIk9ic2VydmVkIM6yLWRpdmVyc2l0eSB0cmVuZCIseCA9ICJQcmVkaWN0ZWQgzrItZGl2ZXJzaXR5IHRyZW5kXG4oZmlzaGluZyBhbmQgdGVtcGVyYXR1cmUgY29uc3RhbnQpIikgKwogIHRoZW1lX2NsYXNzaWMoKQopCgoKI21lcmdlCmphY2NhcmRfZmlzaGluZ19zYnRfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX21lcmdlIDwtIHBsb3RfZ3JpZChqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWQgKyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLjEsMC4zLDAuMSwwLjEpLCJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFjY2FyZF9maXNoaW5nX2NvbnN0YW50X21vZGVsX29ic2VydmVkX3ByZWRpY3RlZCArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAuMSwwLjMsMC4xLDAuMSksImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYWNjYXJkX3RlbXBlcmF0dXJlX2NvbnN0YW50X21vZGVsX29ic2VydmVkX3ByZWRpY3RlZCArIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAuMSwwLjMsMC4xLDAuMSksImNtIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYWNjYXJkX2Zpc2hpbmdfdGVtcF9tb2RlbF9vYnNlcnZlZF9wcmVkaWN0ZWRfdGVtcGZpc2hjb25zdGFudGluc3VydmV5ICsgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMC4xLDAuMywwLjEsMC4xKSwiY20iKSksIG5jb2wgPSAyLCBsYWJlbHMgPSBjKCJhLiIsImIuIiwiYy4iLCJkLiIpKQoKZ2dzYXZlKGphY2NhcmRfZmlzaGluZ19zYnRfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX21lcmdlLCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLGZpbGVuYW1lID0gImphY2NhcmRfZmlzaGluZ19zYnRfbW9kZWxfb2JzZXJ2ZWRfcHJlZGljdGVkX21lcmdlLmpwZyIsIGhlaWdodCA9Niwgd2lkdGggPSA4KQoKCmBgYAoKIyMjTGV0J3MgdmlzdWFsaXplIG1vZGVsIGNvZWZmaWNpZW50cyB3aXRoIHRlbXBlcmF0dXJlIGFuZCBmaXNoaW5nIChzaW1pbGFyIHRvIGZpZ3VyZSAyKQpgYGB7cn0KCiNleHRyYWN0IGNvZWZmaWNpZW50cyB1c2luZyBsaW5lYXIgYWxnZWJyYQppbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZiA8LSBkYXRhLnRhYmxlKGxtX2ludGVyYWN0aW9uX2NvZWZmaWNpZW50c19zZShtb2RfbmFtZSA9IG1vZGVsX2F2Z19kZWx0YTQsIG1vZGVsX2F2ZyA9IFQsIFNCVF9maXNoID0gVCkpCgojYWRkIHN1cnZleSBuYW1lcwppbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZlssc3VydmV5X3VuaXQgOj0gZmFjdG9yKGMoYWxsX3N1cnZleXNbIWFsbF9zdXJ2ZXlzICVpbiUgYygiUk9DS0FMTCIsICJHU0wtUyIpXSxhbGxfc3VydmV5c1shYWxsX3N1cnZleXMgJWluJSBjKCJST0NLQUxMIiwgIkdTTC1TIildKSldCgojYWRkIHByZWRpY3RvciBuYW1lcwppbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZlsscHJlZGljdG9yIDo9IGMocmVwKCJSZWxhdGl2ZSBmaXNoaW5nIGNhdGNoIiwzMikscmVwKCJNaW5pbXVtIHRlbXBlcmF0dXJlIiwzMikpXQoKI3Jlb3JkZXIgdGVtcGVyYXR1cmUgYW5kIGZpc2hpbmcKaW50ZXJhY3Rpb25fYXZnX21vZGVsX2NvZWZbLHByZWRpY3RvciA6PSBmYWN0b3IocHJlZGljdG9yLCBsZXZlbHMgPSBjKCJNaW5pbXVtIHRlbXBlcmF0dXJlIiwiUmVsYXRpdmUgZmlzaGluZyBjYXRjaCIpKV0KCiNsaW5rIGZvciBmdWxsIHN1cnZleSBuYW1lCmludGVyYWN0aW9uX2F2Z19tb2RlbF9jb2VmIDwtIGNvbG9yX2xpbmtbaW50ZXJhY3Rpb25fYXZnX21vZGVsX2NvZWYsIG9uID0gInN1cnZleV91bml0Il0KCiNsaXN0IG9mIFN1cnZleSBOYW1lIFNlYXNvbiBpbiBvcmRlciBieSBzdXJ2ZXkgdW5pdApzZXRrZXkoaW50ZXJhY3Rpb25fYXZnX21vZGVsX2NvZWYsIHN1cnZleV91bml0KQoKc3VydmV5X25hbWVfc2Vhc29uX29yZGVyZWQgPC0gdW5pcXVlKGludGVyYWN0aW9uX2F2Z19tb2RlbF9jb2VmJFN1cnZleV9OYW1lX1NlYXNvbikKCiNNYWtlIFN1cnZleV9OYW1lX1NlYXNvbiBhIGZhY3RvcgppbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZlssU3VydmV5X05hbWVfU2Vhc29uIDo9IGZhY3RvcihTdXJ2ZXlfTmFtZV9TZWFzb24sIGxldmVscyA9IHN1cnZleV9uYW1lX3NlYXNvbl9vcmRlcmVkKV0KCgojbWFyayBzaWduaWZpY2FuY2UKaW50ZXJhY3Rpb25fYXZnX21vZGVsX2NvZWZbLFNpZ25pZmljYW50IDo9IGlmZWxzZSgoZXN0aW1hdGUtc2UgPiAwICYgZXN0aW1hdGUrc2UgPiAwKSB8IChlc3RpbWF0ZS1zZSA8IDAgJiBlc3RpbWF0ZStzZSA8IDApLFQsRildCgoKI1Bsb3QgYm90aApzYnRfZmlzaGluZ19hdmdfbW9kZWxfY29lZiA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwpnZW9tX3BvaW50KGRhdGEgPSBpbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZiwgYWVzKHggPSBTdXJ2ZXlfTmFtZV9TZWFzb24sIHkgPSBlc3RpbWF0ZSwgY29sb3IgPSBTaWduaWZpY2FudCkpICsgIApnZW9tX2Vycm9yYmFyKGRhdGEgPSBpbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZiwgYWVzKHggPSBTdXJ2ZXlfTmFtZV9TZWFzb24sIHltaW4gPSBlc3RpbWF0ZS1zZSwgeW1heCA9IGVzdGltYXRlK3NlLCBjb2xvciA9IFNpZ25pZmljYW50KSwgd2lkdGggPSAwKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtncmV5IiwiYmxhY2siKSkgKwpmYWNldF93cmFwKH5wcmVkaWN0b3IsIHNjYWxlcyA9ICJmcmVlX3giKSArCnNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KSArCiAgbGFicyh5ID0gIkNvZWZmaWNpZW50IiwgeCA9ICIiKSArCmNvb3JkX2ZsaXAoKSArCnRoZW1lX2NsYXNzaWMoKQogIAppbnRlcmFjdGlvbl9hdmdfbW9kZWxfY29lZgoKYGBgCgpQbG90IGFsbCBvdGhlciBjb2VmZmljaWVudHMgaW4gYXZlcmFnZWQgbW9kZWwKYGBge3J9Cm1vZGVsX2F2Z192YWx1ZXMubm9uZmlzaG9ydGVtcCA8LSBtb2RlbF9hdmdfdmFsdWVzW2MoMiwzLDQsOCwxMDQsMTA1LDEwNiksXQoKI21hcmsgc2lnbmlmaWNhbmNlCm1vZGVsX2F2Z192YWx1ZXMubm9uZmlzaG9ydGVtcFssU2lnbmlmaWNhbnQgOj0gaWZlbHNlKChjb2VmLXNlID4gMCAmIGNvZWYrc2UgPiAwKSB8IChjb2VmLXNlIDwgMCAmIGNvZWYrc2UgPCAwKSxULEYpXQoKI21vcmUgaGVscGZ1bCBuYW1lcyBmb3IgdmFyaWFibGVzCm1vZGVsX2F2Z192YWx1ZXMubm9uZmlzaG9ydGVtcFssVmFyaWFibGUgOj0gYygiQXJlYSIsIkRlcHRoIiwiTGF0aXR1ZGUiLCJTcGVjaWVzIGNvdW50IiwiTnVtYmVyIG9mIHRvd3MiLCJMYXRpdHVkZSByYW5nZSIsIkRlcHRoIHJhbmdlIildCgojbWFrZSBmYWN0b3Igd2l0aCBvcmRlcgptb2RlbF9hdmdfdmFsdWVzLm5vbmZpc2hvcnRlbXBbLFZhcmlhYmxlIDo9IGZhY3RvcihWYXJpYWJsZSwgbGV2ZWxzID0gYygiQXJlYSIsIlNwZWNpZXMgY291bnQiLCJOdW1iZXIgb2YgdG93cyIsIkRlcHRoIiwiRGVwdGggcmFuZ2UiLCJMYXRpdHVkZSIsIkxhdGl0dWRlIHJhbmdlIikpXQoKCiNwbG90CmFsbF9hdmdfbW9kZWxfY29lZiA8LSBnZ3Bsb3QoKSArIApnZW9tX3BvaW50KGRhdGEgPSBtb2RlbF9hdmdfdmFsdWVzLm5vbmZpc2hvcnRlbXAsIGFlcyh4ID0gVmFyaWFibGUsIHkgPSBjb2VmLCBjb2xvciA9IFNpZ25pZmljYW50KSkgKyAgCmdlb21fZXJyb3JiYXIoZGF0YSA9IG1vZGVsX2F2Z192YWx1ZXMubm9uZmlzaG9ydGVtcCwgYWVzKHggPSBWYXJpYWJsZSwgeW1pbiA9IGNvZWYtc2UsIHltYXggPSBjb2VmK3NlLCBjb2xvciA9IFNpZ25pZmljYW50KSwgd2lkdGggPSAwKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtncmV5IiwiYmxhY2siKSkgKwpnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCnNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KSArCiAgbGFicyh5ID0gIkNvZWZmaWNpZW50IiwgeCA9ICJcblxuXG4iKSArCmNvb3JkX2ZsaXAoKSArCnRoZW1lX2NsYXNzaWMoKQoKI3Bsb3QKYWxsX2J1dF9sYXRfYXZnX21vZGVsX2NvZWYgPC0gZ2dwbG90KCkgKyAKZ2VvbV9wb2ludChkYXRhID0gbW9kZWxfYXZnX3ZhbHVlcy5ub25maXNob3J0ZW1wW1ZhcmlhYmxlID09ICJMYXRpdHVkZSJdLCBhZXMoeCA9IFZhcmlhYmxlLCB5ID0gY29lZiwgY29sb3IgPSBTaWduaWZpY2FudCkpICsgIApnZW9tX2Vycm9yYmFyKGRhdGEgPSBtb2RlbF9hdmdfdmFsdWVzLm5vbmZpc2hvcnRlbXBbVmFyaWFibGUgPT0gIkxhdGl0dWRlIl0sIGFlcyh4ID0gVmFyaWFibGUsIHltaW4gPSBjb2VmLXNlLCB5bWF4ID0gY29lZitzZSwgY29sb3IgPSBTaWduaWZpY2FudCksIHdpZHRoID0gMCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJkYXJrZ3JleSIsImJsYWNrIikpICsKZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwpzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikgKwogIGxhYnMoeSA9ICJDb2VmZmljaWVudCIsIHggPSAiTW9kZWwgdmFyaWFibGUiKSArCmNvb3JkX2ZsaXAoKSArCnRoZW1lX2NsYXNzaWMoKQoKI3Bsb3QKbGF0X2F2Z19tb2RlbF9jb2VmIDwtIGdncGxvdCgpICsgCmdlb21fcG9pbnQoZGF0YSA9IG1vZGVsX2F2Z192YWx1ZXMubm9uZmlzaG9ydGVtcFtWYXJpYWJsZSAhPSAiTGF0aXR1ZGUiXSwgYWVzKHggPSBWYXJpYWJsZSwgeSA9IGNvZWYsIGNvbG9yID0gU2lnbmlmaWNhbnQpKSArICAKZ2VvbV9lcnJvcmJhcihkYXRhID0gbW9kZWxfYXZnX3ZhbHVlcy5ub25maXNob3J0ZW1wW1ZhcmlhYmxlICE9ICJMYXRpdHVkZSJdLCBhZXMoeCA9IFZhcmlhYmxlLCB5bWluID0gY29lZi1zZSwgeW1heCA9IGNvZWYrc2UsIGNvbG9yID0gU2lnbmlmaWNhbnQpLCB3aWR0aCA9IDApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZGFya2dyZXkiLCJibGFjayIpKSArCmdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSByZXYpICsKICBsYWJzKHkgPSAiQ29lZmZpY2llbnQiLCB4ID0gIk1vZGVsIHZhcmlhYmxlIikgKwpjb29yZF9mbGlwKCkgKwp0aGVtZV9jbGFzc2ljKCkKCiNtZXJnZSBpbnRvIHNpbmdsZSBwbG90Cgptb2RlbF9jb2VmX3N1bW1hcnlfc2J0X2phY2NhcmQgPC0gY293cGxvdDo6cGxvdF9ncmlkKHNidF9maXNoaW5nX2F2Z19tb2RlbF9jb2VmK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJudWxsIiwgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSxhbGxfYXZnX21vZGVsX2NvZWYrdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm51bGwiKSwgbmNvbCA9IDEsIGxhYmVscyA9IGMoIiAgYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLiIsIiAgICAgICAgYy4iKSwgbGFiZWxfeSA9IDAuOTksIHJlbF9oZWlnaHRzID0gYygzLDEpKQoKI0ZpZ3VyZSAzCmdnc2F2ZShtb2RlbF9jb2VmX3N1bW1hcnlfc2J0X2phY2NhcmQsIHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiksZmlsZW5hbWUgPSAibW9kZWxfY29lZl9zdW1tYXJ5X3NidF9qYWNjYXJkLmpwZyIsIGhlaWdodCA9IDYuNSwgd2lkdGggPSA4LCB1bml0ID0gImluIikKZ2dzYXZlKG1vZGVsX2NvZWZfc3VtbWFyeV9zYnRfamFjY2FyZCwgcGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiKSxmaWxlbmFtZSA9ICJGaWczLnRpZmYiLCBoZWlnaHQgPSA2LjUsIHdpZHRoID0gOCwgdW5pdCA9ICJpbiIsIGRwaSA9IDMwMCwgY29tcHJlc3Npb24gPSAibHp3IikKCgpgYGAKCgoKIyMjSW52ZXN0aWdhdGluZyB3aGF0J3MgZ29pbmcgb24gd2l0aCBBbGV1dGlhbiBJc2xhbmRzCmBgYHtyfQoKCiNESVNTSU1JTEFSSVRZIFZTIFRFTVBFUkFUVVJFCmdncGxvdChkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0W3N1cnZleV91bml0ID09ICJBSSJdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IHllYXJseV9taW5fYnlwb2ludF9hdmcsIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSkpICsKICB0aGVtZV9jbGFzc2ljKCkKCiNJZiB3ZSBpZ25vcmUgdHdvIGNvbGRlc3QgeWVhcnMsIHdlIGhhdmUgcm91Z2hseSBwb2ludHMgYXQgKDIuMDcsMC43NikgYW5kICgyLjIsIDAuNjkpLCBzbG9wZSA9IC0wLjUsIHdoaWNoIG1hdGNoZXMgd2hhdCB3ZSBnZXQgKGFsc28gbm90ZSBsYXJnZSBjb25maWRlbmNlIGJvdW5kcykKCiNTbywgdGhlIHF1ZXN0aW9uIGlzLCB3aGF0IGlzIGxlYWRpbmcgdGhlIG1vZGVsIHRvIGlnbm9yZSB0aGVzZSB0d28geWVhcnM/IFdoYXQgZXhwbGFpbnMgdGhpcyB2YXJpYXRpb24gaW4gdGhlIGNvbGRlc3QgeWVhcnM/CgojSnVzdCBydW4gbW9kZWwgZm9yIEFJCnN1bW1hcnkobG0oZGF0YSA9IGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRbc3VydmV5X3VuaXQgPT0gIkFJIl0sIGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlIH4geWVhcmx5X21pbl9ieXBvaW50X2F2ZykpCgojRElTU0lNSUxBUklUWQpnZ3Bsb3QoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdFtzdXJ2ZXlfdW5pdCA9PSAiQUkiXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBhcmVhX2ttLCB5ID0gYW5udWFsX2Rpc3NpbWlsYXJpdHlfdmFsdWUpKSArCiAgdGhlbWVfY2xhc3NpYygpCgojVmVyeSBsYXJnZSBzYW1wbGluZyBhcmVhIGFuZCB2ZXJ5IGxvdyBzYW1wbGluZyBhcmVhcyBhcmUgYm90aCBsb3dlc3QgdmFsdWVzCgoKICAgICAgI1RFTVBFUkFUVVJFCiAgICAgIGdncGxvdChkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0W3N1cnZleV91bml0ID09ICJBSSJdKSArCiAgICAgICAgZ2VvbV9wb2ludChhZXMoeCA9IGFyZWFfa20sIHkgPSB5ZWFybHlfbWluX2J5cG9pbnRfYXZnKSkgKwogICAgICAgIHRoZW1lX2NsYXNzaWMoKQogICAgICAKICAgICAgI1ZlcnkgbGFyZ2Ugc2FtcGxpbmcgYXJlYSBjb2luY2lkZXMgd2l0aCBsb3dlc3QgdGVtcGVyYXR1cmVzCiAgICAgIAoKI0RJU1NJTUlMQVJJVFkKZ2dwbG90KGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRbc3VydmV5X3VuaXQgPT0gIkFJIl0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gc3BwX2NvdW50X2FubnVhbCwgeSA9IGFubnVhbF9kaXNzaW1pbGFyaXR5X3ZhbHVlKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKI0FubnVhbCBkaXNzaW1pbGFyaXR5IHZhbHVlIGluY3JlYXNlcyB3aXRoIHJpY2huZXNzCgogICAgI1RFTVBFUkFUVVJFCiAgICBnZ3Bsb3QoZGlzc2ltaWxhcml0eV9jb3ZhcmlhdGVzX2RyZWRnZS5kdFtzdXJ2ZXlfdW5pdCA9PSAiQUkiXSkgKwogICAgICBnZW9tX3BvaW50KGFlcyh4ID0gc3BwX2NvdW50X2FubnVhbCwgeSA9IHllYXJseV9taW5fYnlwb2ludF9hdmcpKSArCiAgICAgIHRoZW1lX2NsYXNzaWMoKQogICAgCiAgICAjTG93ZXN0IHRlbXBlcmF0dXJlIG9ic2VydmF0aW9uIGNvaW5jaWRlcyB3aXRoIGxvd2VzdCByaWNobmVzcwoKI0RJU1NJTUlMQVJJVFkKZ2dwbG90KGRpc3NpbWlsYXJpdHlfY292YXJpYXRlc19kcmVkZ2UuZHRbc3VydmV5X3VuaXQgPT0gIkFJIl0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gaGF1bF9pZF9jb3VudF9hbm51YWwsIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSkpICsKICB0aGVtZV9jbGFzc2ljKCkKCiNMb3cgbnVtYmVyIG9mIGhhdWxzIGxlZCB0byB2ZXJ5IGxvdyBhbm51YWwgZGlzc2ltaWxhcml0eSB2YWx1ZXMKCiAgICAjVEVNUEVSQVRVUkUKICAgIGdncGxvdChkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0W3N1cnZleV91bml0ID09ICJBSSJdKSArCiAgICAgIGdlb21fcG9pbnQoYWVzKHggPSBoYXVsX2lkX2NvdW50X2FubnVhbCwgeSA9IHllYXJseV9taW5fYnlwb2ludF9hdmcpKSArCiAgICAgIHRoZW1lX2NsYXNzaWMoKQogICAgCiAgICAjTG93ZXN0IHRlbXBlcmF0dXJlIG1hdGNoZWQgd2l0aCBsb3dlc3QgbnVtYmVyIG9mIHNhbXBsZXMKCiNESVNTSU1JTEFSSVRZCmdncGxvdChkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0W3N1cnZleV91bml0ID09ICJBSSJdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGRlcHRoX2FubnVhbF9hdmcsIHkgPSBhbm51YWxfZGlzc2ltaWxhcml0eV92YWx1ZSkpICsKICB0aGVtZV9jbGFzc2ljKCkKCiNTb21lIGRlZXAgdHJhd2xzIGhhdmUgdmVyeSBsb3cgYW5udWFsIGRpc3NpbWlsYXJpdHksIHdoaWxlIG90aGVyIGRlZXAgdHJhd2xzIGhhdmUgaGlnaCBhbm51YWwgZGlzc2ltaWxhcml0eQoKICAgICAgI1RFTVBFUkFUVVJFCiAgICAgIGdncGxvdChkaXNzaW1pbGFyaXR5X2NvdmFyaWF0ZXNfZHJlZGdlLmR0W3N1cnZleV91bml0ID09ICJBSSJdKSArCiAgICAgICAgZ2VvbV9wb2ludChhZXMoeCA9IGRlcHRoX2FubnVhbF9hdmcsIHkgPSB5ZWFybHlfbWluX2J5cG9pbnRfYXZnKSkgKwogICAgICAgIHRoZW1lX2NsYXNzaWMoKQogICAgICAKICAgICAgI0RlZXBlc3QgdHJhd2xzIGhhcHBlbmVkIG9uIGNvbGQgZGF5cwpgYGAKV2hhdCBsZWFkcyB0byB2YXJpYW5jZSBiZWluZyBleHBsYWluZWQgYnkgdmFyaWFibGVzIE9USEVSIHRoYW4gdGVtcGVyYXR1cmUgaW4gY29sZGVzdCB5ZWFycwpTbywgaW4gc3VtbWFyeQotIFZlcnkgbGFyZ2Ugc2FtcGxpbmcgYXJlYSBhbmQgdmVyeSBzbWFsbCBzYW1wbGluZyBhcmVhcyBhcmUgYm90aCBsaW5rZWQgdG8geWVhcnMgb2YgbG93IGRpc3NpbWlsYXJpdHkKLSAqVmVyeSBsYXJnZSBzYW1wbGluZyBhcmVhKiBjb2luY2lkZXMgd2l0aCBsb3dlc3QgdGVtcGVyYXR1cmVzCi0gQW5udWFsIGRpc3NpbWlsYXJpdHkgdmFsdWUgaW5jcmVhc2VzIHdpdGggcmljaG5lc3MKLSAqTG93ZXN0IHRlbXBlcmF0dXJlIG9ic2VydmF0aW9uIGNvaW5jaWRlcyB3aXRoIGxvd2VzdCByaWNobmVzcyoKLSBMb3cgbnVtYmVyIG9mIGhhdWxzIGxlZCB0byB2ZXJ5IGxvdyBhbm51YWwgZGlzc2ltaWxhcml0eSB2YWx1ZXMKLSBMb3dlc3QgdGVtcGVyYXR1cmUgbWF0Y2hlZCB3aXRoICpsb3dlc3QgbnVtYmVyIG9mIHNhbXBsZXMqCi0gU29tZSBkZWVwIHRyYXdscyBoYXZlIHZlcnkgbG93IGFubnVhbCBkaXNzaW1pbGFyaXR5LCB3aGlsZSBvdGhlciBkZWVwIHRyYXdscyBoYXZlIGhpZ2ggYW5udWFsIGRpc3NpbWlsYXJpdHkKLSAqRGVlcGVzdCB0cmF3bHMgaGFwcGVuZWQgb24gY29sZCBkYXlzKgoKRm9yIHRoZSBBbGV1dGlhbiBpc2xhbmRzLCB0aGUgY29sZGVzdCB5ZWFycyB3ZXJlIGFsc286Ci0gdGhlIHllYXJzIG9mIGxhcmdlc3Qgc2FtcGxpbmcgYXJlYQotIHRoZSB5ZWFycyBvZiBsb3dlc3QgcmljaG5lc3MKLSB0aGUgeWVhcnMgb2YgbG93ZXN0IHNhbXBsaW5nIGVmZm9ydCAoIyB0b3dzKQotIHRoZSB5ZWFycyBvZiBkZWVwZXN0IHNhbXBsaW5nCgoKCiNJRiBXRSBBQ1RVQUxMWSBVU0UgVEhJUywgTkVFRCBUTyBVUERBVEUKIyNTaG93IGludGVyY2VwdHMgYnkgcmVnaW9uIGFuZCBzZWFzb24KIwojYGBge3J9CiMKIyNzdXJ2ZXkgaW50ZXJjZXB0cwojc3VydmV5X2ludGVyY2VwdHMgPC0gbW9kZWxfYXZnX3ZhbHVlc1tjKDEsODozOCksLihjb2VmX25hbWUsIGNvZWYsIHNlKV0KI3N1cnZleV9pbnRlcmNlcHRzWzEsc3VydmV5X3VuaXQgOj0gIkFJIl1bMSxjb2VmX3RydWUgOj0gY29lZl0KI3N1cnZleV9pbnRlcmNlcHRzWzI6MzIsc3VydmV5X3VuaXQgOj0gc3Vic3RyKGNvZWZfbmFtZSwgMTIsIHN0cl9sZW5ndGgoY29lZl9uYW1lKSldWzI6MzIsY29lZl90cnVlIDo9IHN1cnZleV9pbnRlcmNlcHRzWzEsY29lZl90cnVlXStjb2VmXQojc3VydmV5X2ludGVyY2VwdHMgPC0gY29sb3JfbGlua1tzdXJ2ZXlfaW50ZXJjZXB0cywgb24gPSAic3VydmV5X3VuaXQiXQojc3VydmV5X2ludGVyY2VwdHNbLFN1cnZleV9OYW1lX1NlYXNvbiA6PSByZW9yZGVyKFN1cnZleV9OYW1lX1NlYXNvbiwgY29lZl90cnVlKV0KIwojCiMjc2Vhc29uX2ludGVyY2VwdHMKI3NlYXNvbl9pbnRlcmNlcHRzIDwtIG1vZGVsX2F2Z192YWx1ZXNbYygxLDM6NSksLihjb2VmX25hbWUsIGNvZWYsIHNlKV0KI3NlYXNvbl9pbnRlcmNlcHRzWzEsc2Vhc29uIDo9ICJTcHJpbmciXVsxLGNvZWZfdHJ1ZSA6PSBjb2VmXQojc2Vhc29uX2ludGVyY2VwdHNbMjo0LHNlYXNvbiA6PSBzdWJzdHIoY29lZl9uYW1lLCA3LCBzdHJfbGVuZ3RoKGNvZWZfbmFtZSkpXVsyOjQsY29lZl90cnVlIDo9IHNlYXNvbl9pbnRlcmNlcHRzWzEsY29lZl90cnVlXStjb2VmXQojc2Vhc29uX2ludGVyY2VwdHNbLHNlYXNvbiA6PSByZW9yZGVyKHNlYXNvbiwgY29lZl90cnVlKV0KIwojCiMjc3VydmV5IGludGVyY2VwdHMKI3N1cnZleV9tb2RlbF9jb2VmIDwtIGdncGxvdCgpICsKI2dlb21fcG9pbnQoZGF0YSA9IHN1cnZleV9pbnRlcmNlcHRzLCBhZXMoeCA9IFN1cnZleV9OYW1lX1NlYXNvbiwgeSA9IGNvZWZfdHJ1ZSkpICsgIAojZ2VvbV9lcnJvcmJhcihkYXRhID0gc3VydmV5X2ludGVyY2VwdHMsIGFlcyh4ID0gU3VydmV5X05hbWVfU2Vhc29uLCB5bWluID0gY29lZl90cnVlLXNlLCB5bWF4ID0gY29lZl90cnVlK3NlKSwgd2lkdGggPSAwKSArCiNzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikgKwojIyAgeWxpbSgwLjM1LDEpICsKIyAgbGFicyh5ID0gIkludGVyY2VwdCIsIHggPSAiIikgKwojY29vcmRfZmxpcCgpICsKI3RoZW1lX2NsYXNzaWMoKQojICAKIyNzZWFzb24gaW50ZXJjZXB0cwojc2Vhc29uX21vZGVsX2NvZWYgPC0gZ2dwbG90KCkgKwojZ2VvbV9wb2ludChkYXRhID0gc2Vhc29uX2ludGVyY2VwdHMsIGFlcyh4ID0gc2Vhc29uLCB5ID0gY29lZl90cnVlKSkgKyAgCiNnZW9tX2Vycm9yYmFyKGRhdGEgPSBzZWFzb25faW50ZXJjZXB0cywgYWVzKHggPSBzZWFzb24sIHltaW4gPSBjb2VmX3RydWUtc2UsIHltYXggPSBjb2VmX3RydWUrc2UpLCB3aWR0aCA9IDApICsKI3NjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KSArCiMgIyB5bGltKDAuMzUsMSkgKwojICBsYWJzKHkgPSAiSW50ZXJjZXB0IiwgeCA9ICIiKSArCiNjb29yZF9mbGlwKCkgKwojdGhlbWVfY2xhc3NpYygpCiMKIyNtZXJnZSBpbnRvIHNpbmdsZSBwbG90CiMKI21vZGVsX2ludGVyY2VwdF9qYWNjYXJkIDwtIGNvd3Bsb3Q6OnBsb3RfZ3JpZChzdXJ2ZXlfbW9kZWxfY29lZit0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFzb25fbW9kZWxfY29lZiwgbmNvbCA9IDEsIGxhYmVscyA9IGMoImEuIiwiYi4iKSwgbGFiZWxfeSA9IDAuOTksIHJlbF9oZWlnaHRzID0gYygzLDEpLCBhbGlnbiA9ICJ2IikKIwojZ2dzYXZlKG1vZGVsX2ludGVyY2VwdF9qYWNjYXJkLCBwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIpLGZpbGVuYW1lID0gIm1vZGVsX2ludGVyY2VwdF9qYWNjYXJkLmpwZyIsIGhlaWdodCA9IDYuNSwgd2lkdGggPSA2LjUsIHVuaXQgPSAiaW4iKQojCiMKIwojYGBgIw==